문제
Django에서 필터와 제외 사이에 차이가 있습니까? 만약 내가 가지고 있다면
self.get_query_set().filter(modelField=x)
그리고 다른 기준을 추가하고 싶습니다. 두 줄의 코드를 따르는 것 사이에 의미있는 차이가 있습니까?
self.get_query_set().filter(user__isnull=False, modelField=x)
self.get_query_set().filter(modelField=x).exclude(user__isnull=True)
더 나은 연습으로 간주됩니까, 아니면 기능과 성능 모두에서 동일합니까?
해결책
둘 다 게으르게 평가되므로 동등하게 수행 할 것으로 기대합니다. SQL은 다르지만 실제 구별은 없습니다.
다른 팁
일반적으로 제외는 필터와 반대입니다. 이 경우 두 예제 모두 동일하게 작동합니다.
여기:
self.get_query_set().filter(user__isnull=False, modelField=x)
필드 사용자가 NULL이 아닌 항목을 선택하고 MODELFIELD에 값 X가 있습니다.
이 경우 :
self.get_query_set().filter(modelField=x).exclude(user__isnull=True)
먼저 modelfield에 value x (value x in null 및 사용자 모두 null이 아님)가있는 항목을 선택하면 Field 사용자 null이있는 항목을 제외합니다.
이 경우 첫 번째 옵션을 더 잘 사용하는 것이 더 깨끗해 보입니다. 그러나 둘 다 동일하게 작동합니다.
그것은 당신이 달성하고자하는 것에 달려 있습니다. 부울 값을 사용하면 쉽게 전환 할 수 있습니다 .exclude()
그리고 .filter()
그러나 3 월부터 기사를 제외한 모든 기사를 받고 싶다면 예를 들어는 어떻습니까? 쿼리를 다음과 같이 쓸 수 있습니다
Posts.objects.exclude(date__month=3)
와 함께 .filter()
(그러나 이것이 실제로 작동하는지 확실하지 않습니다) : :
Posts.objects.filter(date__month__in=[1,2,4,5,6,7,8,9,10,11,12])
또는 a를 사용해야합니다 Q
물체.
기능 이름이 이미 제안한 것처럼 .exclude()
에 사용된다 들어오지 못하게 하다 결과 세트의 데이터 세트. 부울 값의 경우 쉽게이 기능을 반전시키고 사용할 수 있습니다. .filter()
대신, 그러나 다른 값의 경우 더 까다로울 수 있습니다.