TIL 27. Django C.R.U.D #models.py 작성

윤현묵·2021년 8월 20일
1

Django

목록 보기
3/17
post-thumbnail

장고 모델이란 테이블을 정의하는 클래스를 의미합니다. 또한 models.py 파일에 테이블 관련 사항을 정의할 수 있습니다. 아래의 ERD 구성도를 통해 models.py를 작성하는 법에 대해 알아보겠습니다.

models.py를 작성할 때, 일반적으로 표 하나에 대하여 하나의 class로 작성합니다. 따라서 class를 3개로 작성하면 되지만 위의 경우에는 many to many 관계이기 때문에 중간테이블이 자동으로 생성되므로 적성하지 않아도 됩니다.
위의 actors 테이블을 보면 first_name, last_name, date_of_birth 3가지 값이 있습니다.
따라서 type에 맞게 작성해줍니다.
(class Meta: 는 데이터베이스에서 지칭하는 테이블 이름을 선언해줍니다)

class Actor(models.Model):
    first_name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=45)
    data_of_birth = models.DateField()

    class Meta:
        db_table = 'actors'

오른쪽의 movies 테이블은 title, release_date, running_time 값을 가지고 있습니다. type에 맞게 class를 작성합니다.

class Movie(models.Model):
    title = models.CharField(max_length=45)
    release_date = models.DateField()
    running_time = models.IntegerField()
    actors = models.ManyToManyField('Actor', related_name='movies')

    class Meta:
        db_table = 'movies'

위의 class는 테이블이 가지고 있는 변수 외에 actors를 ManyToManyField로 작성해주었는데, 지금 actors와 movies는 many to many 관계로, Actor 클래스에 movies를 넣어주어도 됩니다. 또한 related_name을 설정하면 역참조를 할 때 _set이 아닌 related_name을 사용하여 값을 불러올 수 있습니다. python shell에서 related_name인 movies를 사용하면 아래와 같이 역참조의 값(movie)을 불러올 수 있습니다.

>>> Actor.objects.get(id=1).movies
<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager..ManyRelatedManager object at 0x7fd8d42650d0>
>>> Actor.objects.get(id=1).movies.values()
<QuerySet [{'id': 1, 'title': 'Ubuntu guy', 'release_date': datetime.date(2021, 8, 2), 'running_time': 90}, {'id': 2, 'title': 'Ubuntu boy', 'release_date': datetime.date(2009, 8, 2), 'running_time': 90}]>

이렇게 models.py 작성을 완료하고 해당 프로젝트 파일 경로로 가서 아래와 같이 입력하여 마이그레이션 파일을 생성 및 적용합니다.

python manage.py makemigrations
python manage.py migrate

  • 마이그레이션 파일 (초안) 생성하기 : makemigrations
  • 해당 마이그레이션 파일을 DB에 반영하기 : migrate

이렇게 models.py 작성이 완료되었습니다. 이제 models.py를 기반으로 views.py를 작성해야 합니다.

profile
진정성 있는 개발자를 꿈꾼다

0개의 댓글