1:N 관계
역참조('commet_set')
- Article(1) -> Comment(N)
- article.comment 형태로는 사용할 수 없고 article.commetn_set manager가 생성됨
- 게시글에 몇 개의 댓글이 작성되었는지 Django ORM이 보장할 수 없기 때문
- article은 comment가 있을 수도 있고, 없을 수도 있음
- 실제로 Article 클래스에는 Comment와 어떠한 관계도 작성되어 있지 않음
참조 ('article')
- Comment(N) -> Article(1)
- 댓글의 경우 어떠한 댓글이든 반드시 자신이 참조하고 있는 게시글이 있으므로, comment.article과 같이 접근할 수 있음
- 실제 ForeignKeyField 또한 Comment 클래스에서 작성됨
article.comment_set.all()
Out[4]: <QuerySet [<Comment: first comment>, <Comment: second comment>]>
In [8]: comments = article.comment_set.all()
In [9]: for comment in comments :
...: print(comment.content)
...:
first comment
second comment
article.commet_set.all() -> 1:N관계에서의 조회
article.comments.all() -> M:N 관계에서 조회 하는 것을 권장
article = models.ForeignKey(Article, on_delete=models.CASCADE,related_name='comments')
- 위와 같이 변경하면 article.commetn_set은 더이상 사용할 수 없고 article.comments로 대체됨
- 역참조시 사용할 이름 수정 후 migration 필수
User - Article (1:N)
from django.conf import settings
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
User 모델 참조하기
- settings.AUTH_USER_MODEL
- User 모델에 대한 외래 키 또는 다대다 관계를 정의할 때 사용해야 함
- models.py에서 User모델을 참조할 때 사용
- get_user_model()
- 현재 활성화된 User 모델을 반환
- 커스터마이징한 User 모델이 있을 경우에는 Custom User 모델, 그렇지 않으면 User를 반환
- User를 직접 참조하지 않는 이유
- 장고에서 app이 실행되는 순서
- installed_app에서 순차적으로 app을 import
- 각 앱의 models를 import
- models.py가 아닌 다른 모든 곳에서 유저 모델을 참조할 때 사용
USER와 ARticle간 모델 관계 정의 후 migrations
- null값이 허용되지 않는 user_id필드가 별도의 값 없이 article에 추가되려 하기 때문
- 1을 입력 후 enter
- 1을 입력 후 enter
- 기존 테이블에 추가되는 user_id필드의 값을 1로 설정하겠다는 의미
동완이형 화이팅~~