[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='')
이러한 메소드를 함께 연결하면 기본적으로 각 조건을 독립적으로 확인합니다. 위의 예제에서 alias
null 또는 비어있는 문자열 인 행을 제외 하므로 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)