참고한 사이트이다.
https://nachwon.github.io/django-relationship/#order-customer
Comment
는 Post
하나에 여러 개의 Comment
가 달리는 구조로 즉, 다대일 관계를 가짐을 알 수 있다. 이때는 post
의 author
처럼 Foreign Key
를 만들어주어 참조와 역참조 구조를 만들어 주면 된다.
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class Post(models.Model):
uid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
title = models.CharField(max_length=100)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
edited_at = models.DateTimeField(auto_now=True)
class Comment(models.Model):
post = models.ForeignKey('Post',on_delete=models.CASCADE,related_name='comments')
# model post 참조
author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
class ForeignKey(to, on_delete, **options)
to
: 해당 model이 참조하는 model을 할당함.on_delete
: SQL 제약 조건의 동작을 에뮬레이션 함. 다음과 같은 종류가 존재CASCADE
: 연관된 것들을 삭제, SQL
제약 조건인 ON DELETE CASCADE
의 동작을 에뮬레이션하고 ForeignKey
를 포함한 객체 삭제PROTECT
: ProtectedError
발생을 통해 참조된 객체의 삭제 방지, django.db.IntegrityError
의 서브 클래스SET_NULL
: ForeignKey
를 null
로 세팅. null true
설정일 경우만 가능SET_DEFAULT
: ForeignKey
를 기본 값으로 설정. ForeignKey
의 기본값이 설정되어야 사용 가능SET()
: SET
에 전달된 값을 ForeignKey
에 설정하거나 callable
일 경우 호출된 결과를 설정. 대부분 models.py
가져올 때 쿼리 실행을 피하기 위해 callable
을 전달할 필요가 있음.Do_NOTHING
:아무런 행동도 취하지 않는다.**option
: 부가적인 기능을 도와준다.related_name
: 아래의 역참조 참고.위의 ForeignKey
는 "참조키"의 역할을 하는 것. 따라서 이를 선언한 model
은 to
부분에 있는 model class
를 참조하는 것임.
따라서 역참조는 to
부분이 자신을 참조한 여러개의 데이터를 반대로 끌고온다는 의미임.
예시
comments = Comment.objects.get(id=1)
comments.post # 1번 댓글을 소유한 post를 가져온다.
posts = Post.objects.get(id=1)
posts.comments.all() # 1번 post에 달린 모든 댓글을 쿼리셋으로 만듦
역참조는 어떻게 하냐면, related_name이라는 **option
을 선언하여 related_name = 'comments'
라고 지정해주면 역참조를 할 model
이 comments
라는 변수를 통해 역참조를 할 수 있게 되는 것이다.
만약 related_name
을 쓰지않으면 자동으로 (model class 이름)_set
으로 참조가 가능하다.