Question
는 1, Choice
는 n 의 관계일 때, Choice
에서 Question
을 FK
한다.
# 1:N 모델링
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
테이블명_set
사용# ------- Question에 Choice를 붙여보자
# Question 테이블에서 pk가 1일 데이터를 가져왔다
que = Question.objects.filter(question_text='hello')
# <QuerySet [<Question: hello>]>
# Question 테이블의 pk=1 인 레코드에 딸린 Choice 데이터를 불러왔다.
que.choice_set.all() # 아직 아무거도 없음!
# ------- Question 테이블의 pk=1에 딸리는 Choice를 달아보자
# que 는 Question 테이블이며 역참조를 하는 컬럼에 데이터를 입력하기위해 _set을 사용!
# filter로 가져왔기때문에 인덱스롤 적어준다. get은 안적어도 됨!
que[0].choice_set.create(choice_text='one',votes=0)
que[0].choice_set.create(choice_text='two',votes=0)
que[0].choice_set.create(choice_text='three',votes=0)
# [테이블특정레코드].[역참조테이블명_set].메서드()
# objects 넣지 않는다!
que[0].choice_set.all()
# <QuerySet [<Choice: one>, <Choice: two>, <Choice: three>]>
que[0].choice_set.filter(choice_text='one')
# <QuerySet [<Choice: one>]>
que[0].choice_set.exclude(choice_text='one')
# <QuerySet [<Choice: two>, <Choice: three>]>
que[0].choice_set.get(choice_text='one')
# <Choice: one>
Choice에서 FK 데이터 확인하기. Choice테이블에서 FK지정을 해주었음으려 컬럼명으로 지정한 question 을 통해 값을 확인 할 수 있다.
# shell
choice = Choice.objects.all()
choice[0]
# <Choice: one>
choice[0].question
#<Question: hello>
참조의 경우 해당 테이블의 PK, id값만 인식하기 때문에 해당 테이블의 컬럼명까지 입력해서 데이터를 사용한다.
choice[0].question.question_text
# 'hello'
choice[0].question.pub_date
# datetime.datetime(2020, 6, 6, 4, 55, 25, 981456, tzinfo=<UTC>)