Comment & Foreign Key

8098 단어 djangodjango

참고한 사이트이다.

https://nachwon.github.io/django-relationship/#order-customer

https://velog.io/@hwang-eunji/backend-django-%EC%97%AD%EC%B0%B8%EC%A1%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0

CommentPost하나에 여러 개의 Comment가 달리는 구조로 즉, 다대일 관계를 가짐을 알 수 있다. 이때는 postauthor 처럼 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 : ForeignKeynull로 세팅. null true 설정일 경우만 가능
    • SET_DEFAULT : ForeignKey를 기본 값으로 설정. ForeignKey의 기본값이 설정되어야 사용 가능
    • SET() : SET에 전달된 값을 ForeignKey에 설정하거나 callable일 경우 호출된 결과를 설정. 대부분 models.py 가져올 때 쿼리 실행을 피하기 위해 callable을 전달할 필요가 있음.
    • Do_NOTHING :아무런 행동도 취하지 않는다.
  • **option : 부가적인 기능을 도와준다.
    • related_name : 아래의 역참조 참고.

역참조

위의 ForeignKey는 "참조키"의 역할을 하는 것. 따라서 이를 선언한 modelto 부분에 있는 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'라고 지정해주면 역참조를 할 modelcomments라는 변수를 통해 역참조를 할 수 있게 되는 것이다.
만약 related_name을 쓰지않으면 자동으로 (model class 이름)_set으로 참조가 가능하다.

좋은 웹페이지 즐겨찾기