[django] 쿼리 세트에서 빈 이름 또는 NULL 이름 필터링

내가 가진 first_name, last_name& alias내가 검색해야합니다 (옵션). 따라서 별칭이 설정된 모든 이름을 제공하는 쿼리가 필요합니다.

내가 할 수있는 경우에만 :

Name.objects.filter(alias!="")

따라서 위와 동등한 것은 무엇입니까?



답변

당신은 이것을 할 수 있습니다 :

Name.objects.exclude(alias__isnull=True)

null 값 빈 문자열 을 제외해야하는 경우 선호하는 방법은 다음과 같이 조건을 연결하는 것입니다.

Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')

이러한 메소드를 함께 연결하면 기본적으로 각 조건을 독립적으로 확인합니다. 위의 예제에서 aliasnull 또는 비어있는 문자열 인 행을 제외 하므로 null이 아니거나 비어 Name있지 않은 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 우리는 두 필드가 사실이 아닌 모든 행을 얻을 수 있도록 진정한 GET은 제외됩니다. 생성 된 SQL 코드는 다음과 같습니다.

SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)

또는 논리가 그보다 복잡한 경우 장고의 Q 객체를 사용할 수 있습니다 .

from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))

더 많은 정보를 참조 페이지이 페이지 장고 문서에 있습니다.

제쳐두고 : 내 SQL 예제는 단지 비유입니다. 실제로 생성 된 SQL 코드는 아마도 다르게 보일 것입니다. Django 쿼리가 실제로 생성하는 SQL을 살펴보면 Django 쿼리의 작동 방식에 대해 더 깊이 이해할 수 있습니다.


답변

Name.objects.filter(alias__gt='',alias__isnull=False)


답변

첫째, Django 문서는 CharField 또는 TextField와 같은 문자열 기반 필드에 NULL 값을 사용하지 않는 것이 좋습니다. 설명을 보려면 설명서를 읽으십시오.

https://docs.djangoproject.com/en/dev/ref/models/fields/#null

솔루션 : QuerySet에서 메소드를 함께 연결할 수도 있습니다. 이 시도:

Name.objects.exclude(alias__isnull=True).exclude(alias="")

원하는 세트를 제공해야합니다.


답변

장고 1.8에서

from django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)


답변

를 사용할 때 일반적인 실수를 피하려면 다음을 exclude기억하십시오.

와 같이 exclude () 블록 에 여러 조건을 추가 없습니다 . 여러 조건을 제외하려면 여러 개의 exclude ()를 사용해야합니다filter

잘못된 :

User.objects.filter (email=’example@example.com ‘). exclude (profile__nick_name =’ ‘, profile__avt =’ ‘)

맞음 :

User.objects.filter (email=’example@example.com ‘). exclude (profile__nick_name =’ ‘). exclude (profile__avt =’ ‘)


답변

당신은 단순히 이것을 할 수 있습니다 :

Name.objects.exclude(alias="").exclude(alias=None)

정말 간단합니다. filter일치하는 데 사용되며 exclude지정된 것을 제외한 모든 것을 일치시키는 것입니다. 이것은 SQL로 평가됩니다 NOT alias='' AND alias IS NOT NULL.


답변

이것은 또 다른 간단한 방법입니다.

Name.objects.exclude(alias=None)