필터링을 위한 비어 있거나 NULL 이름에서 queryset
-
20-08-2019 - |
문제
가 first_name,last_name&별명(옵션)내가 필요합니다.그래서 저는 필요한 쿼리를 내게 모든 이름이 있는 별칭을 설정합니다.
는 경우에만 할 수 있습니다.
Name.objects.filter(alias!="")
그래서 무엇입니까?
해결책
당신이 이렇게 할 수 있다:
Name.objects.exclude(alias__isnull=True)
필요하신 경우에는 null 값을 제외 고 빈 문자열이 선호하는 방법은 그래서를 함께 체인 조건을 이렇게:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
체인이 이러한 방법은 함께 기본적으로 검사를 각각 상태를 독립적으로:위의 예에서,우리는 제외 행 alias
이거나 null 나 빈 문자열로,그래서 당신은 모든 Name
체가 null 이 아닌지,빈 alias
다.생성 SQL 다음과 같습니다.
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
를 전달할 수도 있습니다 여러에 인수를 하나의 전화 exclude
, 는 것을 보장하는 것만을 만족하는 개체 모 조건을 얻을 제외:
Name.objects.exclude(some_field=True, other_field=True)
여기에서 행하는 some_field
고 other_field
는 사실을 얻지 않고,그래서 우리는 모든 행 모두 필드는 사실이 아닙니다.생성된 SQL 코드 보이는 것이 작은 다음과 같다:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
는 경우 또는 당신의 논리보다 더 복잡는 사용할 수 있습니다 Django 의 Q 체:
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
더 많은 정보에 대한 참조 이 페이지 고 이 페이지 Django docs.
로 옆:내 SQL 예제는 단지 비유--실제 생성 SQL 코드는 아마 다른 모습.당신은 깊은 이해의 방법 Django 쿼리 작업에 의해 실제적으로 찾고 있에서 SQL 들을 생성합니다.
다른 팁
Name.objects.filter(alias__gt='',alias__isnull=False)
첫째,Django 문서 강력하게 추천을 사용하지 않는 NULL 값을 문자열에 기반과 같은 분야 CharField 또는 TextField.위해 설명서를 읽어 보시기 바랍 설명:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
솔루션:할 수 있도 함께 체인 방법에 QuerySets,나는 생각한다.이것을 보십시오:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
해 당신에게 당신을 설정합니다.
에서 Django1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
일반적인 실수를 피하기 위해 사용하는 경우 exclude
,기억하십시오:
수 지 추가 러 조건으로 는 제외() 블록처럼 filter
.을 제외 여러 조건이 사용해야 합니다에 여러 제외()
예
잘못된:
사용자.체입니다.필터를(이메일='example@example.com').제외(프로필__닉_name=", 프로필__avt=")
정:
User.objects.filter(email='example@example.com').exclude(profile__nick_name=").exclude(profile__avt=")
이것은 다른 간단한 방법으로 그것을 할 수 있습니다.
Name.objects.exclude(alias=None)
단순히 할 수 있다:
Name.objects.exclude(alias="").exclude(alias=None)
그것은 정말 간단합니다. filter
와 일치하는지 확인하기 위해 사용됩고 exclude
일치하는 것이 모두 하지만 그것이 무엇을 합니다.이 평가 SQL 로 NOT alias='' AND alias IS NOT NULL
.