12. Django Shell - 모델 필터링(Model Filtering)

data_hamster·2023년 4월 25일
0

학습 주제
Django Shell - 모델 필터링

학습 내용
모델을 통해서 테이블에서 다양한 조건에 맞는 레코드들만 읽어보는 방법에 대해 알아본다.

get

조건에 맞는 딱 하나의 값을 가져온다.
Question.objects.get(id=1)

또는 정확하지 않지만 비슷한 조건을 줄 수도 있다.
Question.objects.get(question_text__startswith='휴가를')
question text에서 '휴가를'로 시작하는 레코드를 얻는다

pub_date 의 10초를 가지고 값을 가져와 본다.
Question.objects.get(pub_date__second=10)

똑같은 오브젝트를 가져오지만, 각기 다른 조건들로 가져오고 있다.
이번엔 pub_date의 year를 가지고 가져와본다.
에러가 났다.

1개 이상, 4개의 결과를 리턴했다고 한다.
이럴 때는 get 대신 filter를 사용하면 된다. get는 하나만 가져오지만, filter는 조건에 맞는것을 다 가져온다.
Question.objects.filter(pub_date__year=2023)

QuerySet이라고 뜨고, 조건에 맞는 모든 질문이 뜬다.
QuerySet 뒤에 .count()를 입력해 조건에 맞는 것이 몇개 있는지 알 수 있다.


이런식으로 접근해서 .count()를 사용할 수 있다.

  • 주의: question에서 choice_set으로 접근할 때는 QuerySet 이지만, choice에서 question으로 갈 때는 QuerySet이 아니다.


    choice엔 question이 무조건 하나이기에 하나만 리턴된다.(바로 오브젝트로 접근됨) 여러개가 있는 경우에만 QuerySet


이렇게 뒤에 쿼리를 가져올 수 있다. print로 출력해보면

SQL로 잘 표현해 주는게 보인다.
year 대신 second=10의 SQL문을 확인해보았다.

단순히 .all().query는

WHERE 문 없는 SELECT를 볼 수 있다.

startswith="휴가를"의 SQL 쿼리문은

q=Question.objects.get(pk=1)
q.choice_set.all()
print(q.choice_set.all().query)

question 에서 choice를 가져오는 쿼리문

FROM이 question이 아닌 chocie이다. 그럼 q로 시작한 것은 어디에 반영될까? WHERE에 question_id = 1로써 조건으로 반영된다.
모든 choice_set을 가져오는 것이 아닌, question id가 1로 조건을 줘서 나간다.
query는 SQL로 맞게 나가고 있나 확인할 때 사용한다.

profile
반갑습니다 햄스터 좋아합니다

0개의 댓글