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란 키워드로 검색할 수 있다.