Database_Relation

1:N 관계

1:N 관계 related manager

역참조('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
Foreign_key argumetns - 'related_name'

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 모델 참조하기

  1. settings.AUTH_USER_MODEL
    • User 모델에 대한 외래 키 또는 다대다 관계를 정의할 때 사용해야 함
    • models.py에서 User모델을 참조할 때 사용
  2. get_user_model()
    • 현재 활성화된 User 모델을 반환
      • 커스터마이징한 User 모델이 있을 경우에는 Custom User 모델, 그렇지 않으면 User를 반환
      • User를 직접 참조하지 않는 이유
        • 장고에서 app이 실행되는 순서
          1. installed_app에서 순차적으로 app을 import
          2. 각 앱의 models를 import
    • models.py가 아닌 다른 모든 곳에서 유저 모델을 참조할 때 사용

USER와 ARticle간 모델 관계 정의 후 migrations

  • null값이 허용되지 않는 user_id필드가 별도의 값 없이 article에 추가되려 하기 때문
  • 1을 입력 후 enter
    • 현재 화면에서 기본값을 설정하겠다라는 의미
  • 1을 입력 후 enter
    • 기존 테이블에 추가되는 user_id필드의 값을 1로 설정하겠다는 의미

좋은 웹페이지 즐겨찾기