장고 2-06 데이터 저장, "answer_set" 질문드립니다.
조금 이상한 질문일수있습니다만 약간 의아한것같아 질문드립니다.
2-06에 보면
"Question.answer_set.create(content=request.POST.get('content'), create_date=timezone.now())"
". Question과 Answer 모델은 서로 ForeignKey 로 연결되어 있기때문에 이처럼 사용할 수 있다." 라고하셨는데요 외래키로 연결된건 이해가 갑니다만
answer_set 함수는 따로 작성하지 않았고 장고프레임워크 에서 해준거라고 하기에는 프레임워크 네이밍 규칙상 조금 의한부분이있습니다. 제가 윈도우쪽 개발만해보아서 조금 의아한것일수도있습니다. 구현은 잘됩니다.
- 모델 "Question" "Answer" 일떄, Answer가 Question의 외래키를 가지고 있음으로 장고는 "answer_set"을 자동으로구성한다 이떄 "Answer" → 대문자를 소문자로 변경 + "_set" 을 붙인다가 규칙이 맞나요?
예를들어 제가 처음부터 새프로젝트를 만들어 모델의 함수명만 다르게한다면
Qqq(Question), Aaa(Answer)로 만들면 "Question.answer_set.create(content=request.POST.get('content'), create_date=timezone.now()"
이부분을 "Question.aaa_set.create(content=request.POST.get('content'), create_date=timezone.now()으로만 쓰면되는걸까요?
질문글들이 많은데 답변도 하나하나 달아주시고 감사합니다! 큰 도움이되고있습니다 ㅎㅎ
tklee.me 님 1522
M 2020년 7월 11일 12:25 오전
2개의 답변이 있습니다. 1 / 1 Page
네, 말씀하신 것처럼 모델명_set
이 네이밍 규칙입니다. (모델명은 소문자여야 하구요)
모든 것을 자동으로 해 주는 장고의 장점이기도 하지만 헷갈리게 만드는 주범이기도 합니다.
모델명_set
대신 다음처럼 related_name 속성을 사용할 수도 있습니다. (이 부분은 "점프 투 장고"의 뒷 부분에 또 설명이 나옵니다.)
class Question(models.Model):
...
class Answer(models.Model):
question = models.ForeignKey(Question, related_name='question_answers')
...
이렇게 하면 이제 question.answer_set
대신 question.question_answers
라고 사용할 수 있습니다. 개념은 똑 같이 질문의 답변들에 해당되구요.
도움이 되셨기를 바랍니다.
현재 출판사와 함께 책을 다듬어 가고 있는 중입니다. 이 부분도 상세하게 설명할 필요가 있겠네요.
감사합니다.
추가답변
예를들어 코딩중 aQuestion 이라는 질문 한개에 해당되는 객체가 있다고 가정했을 때 이 질문의 답변들을 얻고 싶을 것입니다.
이럴 경우 다음처럼 코딩할 수 있습니다
answer_list = aQuestoin.answer_set.all()
이때 aQuestion.answer_set.all()
에서 사용된 answer 라는 이름은 Answer클래스에서 자동으로 장고가 따온 이름입니다. 물론 Answer 모델 클래스에 Question 모델이 외래키로 엮여 있어야 할 거구요.
헷갈릴수 있는 부분인 Answer클래스에 정의된 question 속성의 이름은 *_set
관련한 코드와는 상관이 없습니다.
박응용 님
M 2020년 7월 11일 11:14 오전
" (모델명은 소문자여야 하구요)" 이말씀은 어딘가에서 사용자가 생성한 객체, 즉 소문자로된 모델명(제가 파악하지 못한)이 아닌 models.py에 있는 모델 Answer 명을 장고가 참조하여 Answer를 answer_set으로 만들어준다로 이해하면될까요?
tklee.me 님
M 2020년 7월 11일 10:13 오전