1)

class Item(models.Model):
...
    class Meta:
        ordering = ['-id']

metadata란 ordering, db talbe 이름과 같이 field에 속하지 않는 어떤 것이든 가리키는 것이다. django/db/models/options.py에서 가능한 옵션을 확인할 수 있다.

다만 이 부분이 Meta 클래스를 내부 클래스로서 정의하는 부분은 설명해주지 못하는 것 같다. django/db/models/base.py의 ModelBase 클래스의 add_to_class 부분을 더 살펴볼 필요가 있을 것 같다.

2)

django-debug-toolbar를 설치하는 과정에서 현재 버전이 삭제돼고 4.1 버전이 설치됐다. 삭제 후 ~=3.0.0 버전을 재설치 해줬다. 그런데 debug-toolbar 버전과 현재 장고 버전이 충돌해서 debug-toolbar는 삭제하고 진행했다.

프로젝트 폴더 settings.py의 INSTALLED_APPS에 'debug-toolbar',를 추가주고 MIDDELWARE에는 'debug-toolbar.middleware.DebugToolbarMiddleware', 룰 추가해줬다. 추가적으로 INTERNAL_IPS은 허용 가능한 IP를 설정해준다.requiremnets.txt에도 까먹지 말자.

미들웨어는 Http 요청/반응 과정과 관련이 있는데, 특정 기능을 수행하기 위한 가벼운 플러그인 정도의 개념이라고 한다. 예를 들어, django에서 Http를 처리하기 위한 요청/응답이 views.py를 거칠 때, 이를 감싸고 있으면서 같이 호출되는 함수를 생각하면 될 것 같다.

debug-toolbar의 html/script의 기본 주입 타겟은 ^/body^이므로 템플릿에서 빼먹지 않도록 하자. 이는 INSERT_BEFORE 부분에 설정돼있다.

3)

1:N 관계에서는 N 필드에 외래키를 지정해준다.

1:1 관계는 user:profile이 대표적인데 django의 user model은 auth에서 제공해서 customizing 정도만 가능하므로 profile에 OneToOneField를 지정해준다.

4)

class Director(models.Model):
    name = models.CharField(max_length=15)

class Item(models.Model):
...
    director = models.ForeignKey(Director, on_delete=models.CASCADE)

한 명의 director가 여러 물건들을 셀렉트하는 기능을 추가하려고 director라는 외래키를 추가했다. 최초 Director 클래스가 더 아래 있을 때는 외래키가 모델 클래스를 참조하지 못해 "not defined" 에러가 발생했다. gallery 앱의 admin.py에도 등록해주도록 한다.

director는 director_id 필드를 가지며 db table을 생성한다. makemigrations 이후 sqlmigrate 명령어로 확인 가능하다.

ForeignKey-ForeignObject-RelatedField 순으로 상속이 이뤄지는데 RelatedField는 관계를 위한 가장 기본적인 필드로서, 1:N, 1:1, M:N 등 모든 조건이 False로 지정돼있다.

on_delete 옵션은 보통 CASCADE만 사용하지만, django/db/models/deletion.py에 더 많은 옵션이 있다.

makemigrations를 진행하면서 외래키가 not nullable인 것을 알게됐다. null=True로 변경하고 처리했다.

5)

from django.conf import settings

class Item(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

AUTH_USER_MODEL은 변경 시 settings.py에 저장해줘야하고 기본값은 django/conf/global_settings.py에 auth.User로 저장돼있다. 활성화된 User 모델을 확실히 참조하려면 django.contrib.auth.models의 User로 지정하는 것은 위험하다.

0개의 댓글