답변:
당신은 이것을 할 수 있습니다 :
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 쿼리의 작동 방식에 대해 더 깊이 이해할 수 있습니다.
OR
조건을 융합 하기 위해를 사용한다고 보장되는 것은 아닙니다 . 명확하게 답변을 편집하겠습니다.
NOT (A AND B)
:와 동일 함) NOT A OR NOT B
. SQL을 알고 있지만 ORM에 익숙하지 않은 새로운 Django 개발자에게는 혼동을 줄 수 있습니다.
AND
는 첫 번째 쿼리에서를 OR
사용 중이기 때문에 이점을 갖기 때문에 작동합니다 exclude
. 일반적으로 체인을 THEN
, 즉 으로 생각하는 것이 더 정확할 것입니다 exclude(A) THEN exclude(B)
. 위의 가혹한 언어에 대해 죄송합니다. 귀하의 답변은 실제로 좋지만 새로운 개발자가 귀하의 답변을 너무 일반적으로 받아들이는 것이 걱정됩니다.
AND
과 OR
는 SQL 배경에서 장고에 오는 사람에게 유용 할 수 있습니다. 장고에 대한 더 깊은 이해를 위해 문서는 내가 할 수있는 것보다 더 나은 일을한다고 생각합니다.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=False
조건이 중복 적이라고 생각합니다 . 필드가 Null
반드시 첫 번째 절에서 제외됩니까?
alias__gt
JSON과 같은 빈 문자열을 제외하려는 JSON 유형 열에서 작동하는 유일한 방법이었습니다 {'something:''}
. 따라서 작동 구문은 다음과 같습니다.jsoncolumnname__something__gt=''
첫째, Django 문서는 CharField 또는 TextField와 같은 문자열 기반 필드에 NULL 값을 사용하지 않는 것이 좋습니다. 설명을 보려면 설명서를 읽으십시오.
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
솔루션 : QuerySet에서 메소드를 함께 연결할 수도 있습니다. 이 시도:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
원하는 세트를 제공해야합니다.
를 사용할 때 일반적인 실수를 피하려면 다음을 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
.
alias=""
) 및 NULL ( alias=None
) 별칭 을 제외하는 것을 목표로 합니다. 귀하의 인스턴스는로 포함됩니다 Name(alias=None)
.
.filter(alias!="")
제목과 같지 않은 내용에 대답했습니다 . 내 답변을 편집했습니다. 그러나 문자 필드는 NULL 값을 허용하지 않으며 규칙에 따라 값이 아닌 경우 빈 문자열을 사용해야합니다.
OR
(이 경우에만) SQL을 생성합니다AND
. 참조 할 수 있도록이 페이지를 참조하십시오 : docs.djangoproject.com/en/dev/topics/db/queries/... 체인의 장점은 당신이 혼합 수 있다는 것입니다exclude
및filter
복잡한 쿼리 조건을 모델링 할 수 있습니다. 실제 SQL을 모델링OR
하려면 Django Q 오브젝트를 사용해야합니다. docs.djangoproject.com/en/dev/topics/db/queries/… 응답이 심각하게 오도되기 때문에이를 반영하도록 편집을 편집하십시오. .