장고/점프투장고

장고 objects 쿼리 조회/ 추가 / 수정 / 답글 / 답글 조회

나도초딩 2023. 11. 11.

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

Question 수정

https://wikidocs.net/70650

 

2-02 모델

* `[완성 소스]` : [github.com/pahkey/jump2django/tree/2-02](https://github.com/pahkey/jump2django/tree/…

wikidocs.net

이번에는 저장한 Question 데이터를 수정해 보자. 먼저 다음과 같이 id 값이 2인 데이터를 조회한다.

>>> q = Question.objects.get(id=2)
>>> q
<Question: 장고 모델 질문입니다.>
q.subject = '수정합시다'
q.save()

#삭제 q.delete()

Answer 작성 ( FK :: question, subject, content, create_date)

Answer 레코드 추가시, FK 인 question 값을 넣기 위해, Question 의 외래키(id) 를 조회 후, 대입

a = Answer(question= q, subject='답변', content = '냉무', create_date=timezone.now())

 

>>> q = Question.objects.get(id=2)
>>> q
<Question: Django Model Question>
>>> from django.utils import timezone
>>> a = Answer(question=q, content='네 자동으로 생성됩니다.', create_date=timezone.now())
>>> a.save()

답변 데이터를 만들기 위해서는 질문이 필요하므로 id가 2인 질문을 먼저 조회한 후 question 속성에 대입해 주었다.

Answer 모델도 Question 모델과 마찬가지로 유일한 값을 의미하는 id가 자동으로 생성 된다.

>>> a.id
1

  

답변과 연결된 질문을 찾는다. 구매자가 구매한 물품, 예약자가 예약한 상품을 조회할 수 있다. 

 _set 어트리뷰트로 나를 참조하는 레코드 조회시, filter get 으로만 사용 가능하다. filter는 쿼리셋이라서 안됨.

a.question

원 글의 댓글 조회 : q.answer_set.all()

현 상품의 구매자 조회 :  item.customer_set.all()

카테고리에 소속된 글 : category.post_set.all()

 

답변을 조회하는 방법은 질문과 마찬가지로 Answer의 id 값을 사용하면 된다.

>>> a = Answer.objects.get(id=1)
>>> a
<Answer: Answer object (1)>

답변에 연결된 질문도 조회할 수 있다.

>>> a.question
<Question: Django Model Question>

Answer 모델 객체인 a를 통해서 질문을 찾는것은 Answer 모델에 question 속성이 연결되어 있기 때문에 매우 쉽다. 그렇다면 질문을 이용하여 답변을 찾는 것은 가능할까?

가능하다. 다음처럼 하면 된다.

>>> q.answer_set.all()
<QuerySet [<Answer: Answer object (1)>]>

q.answer_set을 사용하면 질문에 연결된 답변을 가져올 수 있다. Question 모델에는 answer_set 이라는 속성이 없지만 Answer 모델에 Question 모델이 ForignKey로 연결되어 있기 때문에 q.answer_set 과 같은 역방향 접근이 가능하다.

연결모델명_set(예:answer_set)은 상식적으로 생각하면 더 쉽다. 질문 하나에는 여러개의 답변이 가능하므로 q.answer_set이 가능하지만 답변 하나에는 여러개의 질문이 있을 수 없으므로 a.question_set은 불가능하다. 답변 하나에는 질문 하나만 가능하기 때문에 a.question만 가능하다.

정말 신통방통한 장고의 기능이 아닐수 없다. 연결모델명_set 방법은 자주 사용하니 꼭 기억해 두도록 하자.

댓글