Django
Django Model _set 메서드에 관하여
Andrew-Yun
2020. 11. 17. 21:02
Django에서 Model을 다른 모델에서 Foreign Key로 참조하여 선언 후 migration하게 되면, 내가 생성한 적이 없는 [Model 이름]_set이란 메서드가 생성된걸 알 수 있다.
장고에서는 모델이 다른 모델에서 외래 키로 참조됐을 때, 참조한 모델과 대응되는건 하나밖에 없기 때문에 이런 관계를 표현하기 쉽도록 인터페이스화 해놓았다.
이해를 돕기 위해 예시를 들어보겠다.
class Question(models.Model):
subject = models.CharField(max_length=200)
content = models.TextField()
create_date = models.DateTimeField()
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
content = models.TextField()
create_date = models.DateTimeField()
Answer 모델은 Question 모델을 참조하고 있다. Answer 모델을 만드려면 직접 생성할 수도 있겠지만 반대로, Answer 모델과 대응되는 Question 모델은 유일하다. 그렇다면 다음의 방법으로 Answer 모델을 만들 수 있다.
question = get_object_or_404(Question, pk=question_id)
# 이 질문에 대응되는 답변을 만들어라!
question.answer_set.create(content=request.POST.get('content'), create_date=timezone.now())
어떻게 이런게 가능할까
장고 공식문서에 따르면 모델을 migrate하면 내부적으로 모델의 인스턴스마다 id를 부여한다고 한다.
즉, 외래 키로 참조하는건 해당 모델의 인스턴스의 id이기 때문에 유일한 참조가 가능한 것이라고 볼 수 있다.
불필요한 DB 쿼리문을 작성하지 않고, 코딩할 수 있다는 장고의 철학이 돋보이는 기능이다.
2020-11-17 : 공식문서에서 Related objects reference란 키워드로 검색할 수 있다.