Django Q 개체에 대한 간단한 이해

2062 단어
일반적으로 Django 프로그램에서 데이터베이스 조회 작업은 다음과 같은 QuerySet에서 수행됩니다.
>>> q1 = Entry.objects.filter(title__startswith = "What")
>>> q2 = q1.exclude(pub_date__gte = datetime.date.today())
>>> q3 = q1.filter(pub_date__gte = datetime.date.today())

또는 다음과 같이 조합합니다.
>>> q1 = Entry.objects.filter(title_startswith = "What").exclude(pub_date_gte = datetime.date.today())

프로그램이 갈수록 복잡해지면서 조회 조건도 따라서 복잡해지기 시작했다.
Q 대상은 조회 조건을 조합하기 위한 것이다
조회할 때 조합 조건이 필요하면 Q 조회 대상을 사용할 수 있습니다.
from django.db.models import Q
q = Q(question_startswith = "What")

이렇게 하면 하나의 Q 대상을 생성하여 기호&|로 여러 개의 Q 대상을 조합하여 Filter(), exclude(), get() 등 함수에 전달할 수 있다.여러 개의 Q 대상을 조합할 때, Django는 자동으로 새로운 Q 대상을 생성합니다.예를 들어 다음 코드는 두 조건을 하나로 조합합니다.
Q(question__startswith = 'Who') | Q(question__startswith = 'What')

이러한 코드는 SQL 문을 사용하여 다음과 같이 이해할 수 있습니다.
WHERE question LIKE 'Who%' OR question LIKE 'What%'

또한 Q 객체 앞에서 ~를 사용하여 "비"를 나타낼 수 있습니다.
Q(question__startswith = 'Who') | ~Q(pub_date__year = 2005)

해당 SQL 문은 다음과 같습니다.
WHERE question like "Who%" OR year(pub_date) != 2005

이렇게 하면 & 또는 | 그리고 ()를 사용하여 조건을 그룹으로 나누어 더욱 복잡한 조회 논리로 조합할 수 있다.
또한 질의 함수에 여러 객체Q를 전달할 수도 있습니다.
News.objects.get(
    Q(question__startswith = 'Who'),
    Q(pub_date = datetime.date(2005, 5, 2)) | Q(pub_date = datetime.date(2005, 5, 6))
)

여러 개 Q 대상 간의 관계는 Django가 자동으로 '그리고 (and)' 관계로 이해한다.위 코드에 해당하는 SQL 문은 다음과 같습니다.
SELECT * from news WHERE question LIKE 'Who%'  AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')

좋은 웹페이지 즐겨찾기