django shell CRUD #3

eunji hwang·2020년 6월 6일
0

BACKEND-PYTHON-DJANGO

목록 보기
26/28

1:N 데이터 조회

Question는 1, Choice는 n 의 관계일 때, Choice에서 QuestionFK한다.

# 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
  • Choice -> Question 방향에서 question(FK)속성을 사용
  • Question -> Choice 방향에서 choise_set 속성을 사용 역참조일때 테이블명_set사용

역참조 DB에 내용추가

# ------- 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>

정참조 DB 읽기

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>)
profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!

0개의 댓글