[Django] 3. Model

2024. 1. 25. 14:31dev/django

728x90
반응형

path : projects/mysite/config/settings.py 를 보면,

INSTALLED_APPS가 있다. 이미 설치된 앱들을 표현한 것이고,

 

runserver하여 django를 시작하면 apply migrations라는 내용이 나온다.

그 중 messages, staticfiles는 DB와 관련이 없기 때문에 경고문이 나오지 않은 것이다.

 

 

DATABASES에 대한 정보도 나오는데 엔진은 'django.db.backends.sqlite3'를 사용하고,

이름에 BASE_DIR/'db.sqlite3'라고 되어 있는데,

 

BASE_DIR은 프로젝트 디렉토리를 의미한다.

현재는 mysite라는 프로젝트이므로 BASE_DIR은 mysite이하를 가리킨다.

 

 

데이터베이스 마이그레이션

$ python manage.py migrate

 

 

Django는 ORM(Object Relational Mapping)으로 데이터베이스 테이블을 모델화하여 사용함.

만약에, 질문을 하고 답변을 하는 데이터가 필요하다면 생각해보자.

 

질문 모델에는 질문 제목, 질문 내용, 질문을 한 날짜가 필요할 것이고,

답변 모델에는 어떤 질문 제목에 대한 답변인지, 답변 내용, 답변을 작성한 날짜가 필요할 것이다.

 

모델 생성

Question과 Answer모델을 pybo에 추가해보자.

path : projects/mysite/pybo/models.py

from django.db import models

# Create your models here.
# Question Model
class Question(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()

# Answer Model
class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    content = models.TextField()
    create_date = models.DateTimeField()

 

modes.CharField를 사용하면 글자수에 제한을 줄 수 있고, Parameter로 max_length로 제한 값을 지정할 수 있다.

글자수가 제한 없는 텍스트는 TextField를 사용하고, 날짜와 관련된 속성은 DateTimeField를 사용한다.

 

Answer모델에 대한 답변으로 Question모델의 속성을 가져와야 하므로 ForeignKey 파라메터에 Question모델을 연결해주고 ForeignKey로 연결된 질문 Question모델이 삭제될 경우 답변도 따라서 삭제되도록 on_delete=models.CASCADE를 사용한다.

 

 

테이블 생성

path : projects/mysite/config/settings.py

INSTALLED_APPS = [
    'pybo.apps.PyboConfig',
    'django.contrib.admin',

 

 

신규로 모델을 생성하는 경우나 변경한 경우  다음 명령어를 실행해주어야 한다.

메서드가 추가된 경우에는 할 필요 없다.

$ python manage.py makemigrations
Migrations for 'pybo':
  pybo\migrations\0001_initial.py
    - Create model Question
    - Create model Answer
(mysite)

 

ORM이 어떻게 쿼리문을 만들었는지 확인

(번호는 migrations폴더에 있다)

$python manage.py sqlmigrate 0001

 

 

준비된 모델 생성문을 실행해주면 DB에 반영된다.

$ python manage.py migrate

 

 

 

모델들이 생성되었으면 사용해본다.

$ python manage.py shell

 

>>> from pybo.models import Answer, Question
>>> from django.utils import timezone
>>> q = Question(subject="pybo가 무엇인가요?"
... , content="pybo에 대해서 알고 싶습니다.",
... create_date=timezone.now())
>>> q.save()

 

 

Question모델 전체 조회

>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>, <Question: Question object (2)>]>

 

 

Question모델 원하는 데이터 조회

filter

>>> Question.objects.filter(id=2)
<QuerySet [<Question: Question object (2)>]>

 

get

>>> Question.objects.get(id=1)
<Question: Question object (1)>

 

포함된 데이터 조회

subject다음 언더바가 2개 이다.

>>> Question.objects.filter(subject__contains='English')
<QuerySet []>

 

 

object가 아닌 string형태로 반환하려면 Model에서 str 오버라이드 함수를 변경해주어야 한다.

class Question(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()

    def __str__(self):
        return self.subject

 

 

Question모델 수정

모델 인스턴스 조회 후 생성

>>> q = Question.objects.get(id=2)
>>> q
<Question: hohoho>

 

>> 수정

>>> q.subject = 'Django Model Question'
>>> q
<Question: Django Model Question>

 

그리고 중요한 것은 save()를 꼭 해주어야 저장이 된다.

>>> q.save()

 

 

Question모델 삭제

>>> q = Question.objects.get(id=1)
>>> q.delete()
(1, {'pybo.Question': 1})
>>> Question.objects.all()
<QuerySet [<Question: Django Model Question>]>

 

 

Answer모델 생성

foreign key로 Questino 인스턴스를 넣는 것이 특징

>>> q = Question.objects.first()
>>> q
<Question: Django Model Question>
>>> a = Answer( 
... question = q,
... content = 'I will be quite Rich Guy',            
... create_date = timezone.now())
>>> a.save()

 

 

Answer모델 조회

>>> Answer.objects.all()
<QuerySet [<Answer: Answer object (1)>]>
>>> a.question
<Question: Django Model Question>
>>> a.content

 

해당 Question모델이 연결된 Answer모델 조회

foreign key로 연결된 모델을 역으로 조회할 수 있다.

>>> q.answer_set.all()
<QuerySet [<Answer: Answer object (1)>]>

 

728x90
반응형

'dev > django' 카테고리의 다른 글

[Django] 6. Form  (0) 2024.01.25
[Django] 5. Template  (0) 2024.01.25
[Django] 4. Admin  (0) 2024.01.25
[Django] 2. Basic  (0) 2024.01.25
[Django] 1. Configure  (0) 2024.01.25