학습 주제
Django Shell - 모델 필터링
학습 내용
모델을 통해서 테이블에서 다양한 조건에 맞는 레코드들만 읽어보는 방법에 대해 알아본다.
조건에 맞는 딱 하나의 값을 가져온다.
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()
를 사용할 수 있다.
이렇게 뒤에 쿼리를 가져올 수 있다. 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로 맞게 나가고 있나 확인할 때 사용한다.