나는 검색해야하는 first_name, last_name & 별칭 (선택 사항)을가집니다. 따라서 별칭이 설정된 모든 이름을 제공하는 쿼리가 필요합니다.쿼리 세트에서 빈 또는 NULL 이름 필터링
만 내가 할 수있는 경우 :
Name.objects.filter(alias!="")
그래서, 위의 동등한 무엇인가?
나는 검색해야하는 first_name, last_name & 별칭 (선택 사항)을가집니다. 따라서 별칭이 설정된 모든 이름을 제공하는 쿼리가 필요합니다.쿼리 세트에서 빈 또는 NULL 이름 필터링
만 내가 할 수있는 경우 :
Name.objects.filter(alias!="")
그래서, 위의 동등한 무엇인가?
당신은이 작업을 수행 할 수 있습니다 : 그래서 같은
Name.objects.exclude(alias__isnull=True)
당신이 null 값 및 빈 문자열을 제외해야하는 경우, 그렇게 할 수있는 좋은 방법은 체인입니다 함께 조건 :
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
이러한 메서드를 함께 사용하면 기본적으로 각 조건을 개별적으로 검사합니다. 위의 예에서 alias
이 null 인 행을 제외합니다. 또는은 빈 문자열이므로 null이 아니며 공백이 아닌 alias
필드가있는 Name
개체를 모두 가져옵니다. 생성 된 SQL은 같은 보일 것이다 : 보장 것 또한 exclude
에 단일 통화에 여러 인수를 전달할 수 있습니다
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
, 즉 모든 조건이 제외 얻을 충족 객체 만 :
Name.objects.exclude(some_field=True, other_field=True)
여기에서 some_field
및other_field
이 true 인 행은 제외되므로 두 필드가 모두 참이 아닌 행을 모두 가져옵니다. 생성 된 SQL 코드는 거의 같을 것이다 :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
더 많은 정보에 this page 및 this page를 참조하십시오 당신의 논리가보다 더 복잡한 경우
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
또는, 당신은 장고의이 Q objects 사용할 수 있습니다 Django 문서.
내 SQL 예제는 단지 비유입니다. 실제로 생성 된 SQL 코드는 다르게 보일 것입니다. Django가 생성하는 SQL을 실제로 살펴봄으로써 장고 쿼리가 어떻게 작동하는지 더 깊이 이해할 수 있습니다.
먼저 Django 문서는 CharField 또는 TextField와 같은 문자열 기반 필드에 NULL 값을 사용하지 말 것을 강력히 권장합니다. 설명에 대한 설명서를 읽어
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
해결 방법 : 또한 함께 검색어 세트에 대한 방법을 체인 수, 나는 생각한다. 이것을 시도하십시오 :
Name.objects.exclude(alias__isnull=True).exclude(alias="")
당신이 찾고있는 세트를 제공해야합니다.
그것이 좋을 것이라고 말하는 곳에 대한 링크. https://docs.djangoproject.com/en/dev/ref/models/fields/#null – mpen
Name.objects.filter(alias__gt='',alias__isnull=False)
장고 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
이것은 " 당신이 할 수있는 일 "이지,해야 할 일이 아닙니다. 이는 두 가지 간단한 검사를 통해 쿼리 복잡성을 크게 줄입니다. – Oli
필자는 편집이 잘못되었다고 생각합니다. 연결 필터는 자동으로 SQL 'OR'(이 경우에만)을 생성하지 않으며 SQL AND를 생성합니다. 참조를 위해이 페이지를 참조하십시오 : https://docs.djangoproject.com/en/dev/topics/db/queries/#chaining-filters 연결의 이점은 모델에'exclude'와'filter'를 섞어서 사용할 수 있다는 것입니다 복잡한 쿼리 조건. 실제 SQL'OR'을 모델링하려면 Django Q 객체를 사용해야합니다. https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q- 객체 대답을 심각하게 오해 할 수있는만큼 편집하여 편집하십시오. – shezi
@shezi : 비유로 더 많은 것을 의미했습니다. 실제 SQL 코드가 조건을 통합하는 데 'OR'을 사용한다는 것을 의미하지는 않습니다. 내가 명확하게 대답을 수정합니다. –
'NOT (A AND B)'과 같은 논리는 여러 가지 방법으로 표현할 수 있습니다. 'NOT A OR NOT B'와 같습니다. SQL을 알고 있지만 ORM에 익숙하지 않은 장고 개발자들에게는 혼란 스럽습니다. –