장고 2-06 데이터 저장, "answer_set" 질문드립니다.

조금 이상한 질문일수있습니다만 약간 의아한것같아 질문드립니다.

2-06에 보면
"Question.answer_set.create(content=request.POST.get('content'), create_date=timezone.now())"

". Question과 Answer 모델은 서로 ForeignKey 로 연결되어 있기때문에 이처럼 사용할 수 있다." 라고하셨는데요 외래키로 연결된건 이해가 갑니다만
answer_set 함수는 따로 작성하지 않았고 장고프레임워크 에서 해준거라고 하기에는 프레임워크 네이밍 규칙상 조금 의한부분이있습니다. 제가 윈도우쪽 개발만해보아서 조금 의아한것일수도있습니다. 구현은 잘됩니다.

  1. 모델 "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 1324

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 오전

추가 질문 확인 부탁드립니다! - tklee.me님, M 2020년 7월 11일 10:14 오전 추천 , 대댓글
추가답변 추가했습니다. - 박응용님, 2020년 7월 11일 11:16 오전 추천 , 대댓글

" (모델명은 소문자여야 하구요)" 이말씀은 어딘가에서 사용자가 생성한 객체, 즉 소문자로된 모델명(제가 파악하지 못한)이 아닌 models.py에 있는 모델 Answer 명을 장고가 참조하여 Answer를 answer_set으로 만들어준다로 이해하면될까요?

tklee.me

M 2020년 7월 11일 10:13 오전

원 답변에 "추가답변" 이라고 추가했습니다. - 박응용님, 2020년 7월 11일 11:15 오전 추천 , 대댓글
정확히 이해되었습니다 감사합니다! - tklee.me님, 2020년 7월 11일 1:07 오후 추천 , 대댓글