문제

Django 모델 QuerySets에서는 __gt 그리고 __lt 비교 값의 경우, 그러나 a __ne/!=/<> (동일하지 않습니다?)

동등한 것을 사용하여 걸러 내고 싶습니다.

예시:

Model:
    bool a;
    int x;

원해요

results = Model.objects.exclude(a=true, x!=5)

그만큼 != 올바른 구문이 아닙니다. 나는 시도했다 __ne, <>.

나는 다음을 사용했다.

results = Model.objects.exclude(a=true, x__lt=5).exclude(a=true, x__gt=5)
도움이 되었습니까?

해결책

아마도 Q 객체 이 문제에 도움이 될 수 있습니다. 나는 그것들을 사용한 적이 없지만 정상적인 파이썬 표현과 같이 부정하고 결합 할 수있는 것 같습니다.

업데이트 : 방금 시도해 보았습니다. 아주 잘 작동하는 것 같습니다.

>>> from myapp.models import Entry
>>> from django.db.models import Q

>>> Entry.objects.filter(~Q(id = 3))

[<Entry: Entry object>, <Entry: Entry object>, <Entry: Entry object>, ...]

다른 팁

귀하의 쿼리는 이중 음수가있는 것으로 보이며 X는 5가 아닌 모든 행을 배제하려고합니다. 즉, X가 5 인 모든 행을 포함하려는 모든 줄을 포함하려고합니다.

results = Model.objects.filter(x=5).exclude(a=true)

특정 질문에 답하기 위해 "동등하지 않은"것은 없지만 Django는 "필터"와 "제외"메소드를 모두 가지고 있기 때문에 항상 로직 라운드를 전환하여 원하는 결과를 얻을 수 있기 때문일 것입니다.

그만큼 field=value 쿼리의 구문은 속기입니다 field__exact=value. 그렇다고 말합니다 Django는 식별자의 쿼리 필드에 쿼리 연산자를 넣습니다.. Django는 다음 연산자를 지원합니다.

exact
iexact
contains
icontains
in
gt
gte
lt
lte
startswith
istartswith
endswith
iendswith
range
year
month
day
week_day
isnull
search
regex
iregex

나는 이것들과 Q 개체를 다음과 같이 결합하여 확신합니다. Dave Vogt가 제안합니다 그리고 사용 filter() 또는 exclude() ~처럼 Jason Baker가 제안합니다 가능한 쿼리에 필요한 것을 정확히 얻을 수 있습니다.

Django 1.7을 사용하여 사용자 정의 조회를 쉽게 만들 수 있습니다. 있습니다 __ne 조회 예제 장고 공식 문서.

먼저 조회 자체를 만들어야합니다.

from django.db.models import Lookup

class NotEqual(Lookup):
    lookup_name = 'ne'

    def as_sql(self, qn, connection):
        lhs, lhs_params = self.process_lhs(qn, connection)
        rhs, rhs_params = self.process_rhs(qn, connection)
        params = lhs_params + rhs_params
        return '%s <> %s' % (lhs, rhs), params

그런 다음 등록해야합니다.

from django.db.models.fields import Field
Field.register_lookup(NotEqual)

그리고 이제 당신은 그것을 사용할 수 있습니다 __ne 다음과 같은 쿼리에서 조회하십시오.

results = Model.objects.exclude(a=True, x__ne=5)

~ 안에 Django 1.9/1.10 세 가지 옵션이 있습니다.

  1. 체인 exclude 그리고 filter

    results = Model.objects.exclude(a=true).filter(x=5)
    
  2. 사용 Q() 사물 그리고 ~ 운영자

    from django.db.models import Q
    object_list = QuerySet.filter(~Q(a=True), x=5)
    
  3. 등록 a 사용자 정의 조회 기능

    from django.db.models import Lookup
    from django.db.models.fields import Field
    
    @Field.register_lookup
    class NotEqual(Lookup):
        lookup_name = 'ne'
    
        def as_sql(self, compiler, connection):
            lhs, lhs_params = self.process_lhs(compiler, connection)
            rhs, rhs_params = self.process_rhs(compiler, connection)
            params = lhs_params + rhs_params
            return '%s <> %s' % (lhs, rhs), params
    

    그만큼 register_lookup 데코레이터가 추가되었습니다 장고 1.8 평소와 같이 사용자 정의 조회를 활성화합니다.

    results = Model.objects.exclude(a=True, x__ne=5)
    

모델을 사용하면 필터링 할 수 있습니다 =, __gt, __gte, __lt, __lte, 당신은 사용할 수 없습니다 ne, != 또는 <>. 그러나 Q 객체 사용에 대한 더 나은 필터링을 달성 할 수 있습니다.

체인을 피할 수 있습니다 QuerySet.filter() 그리고 QuerySet.exlude(), 그리고 이것을 사용하십시오 :

from django.db.models import Q
object_list = QuerySet.filter(~Q(field='not wanted'), field='wanted')

보류중인 디자인 결정. 한편, 사용 exclude()

Django Issue 추적기에는 놀라운 것이 있습니다 항목 #5763, 제목 "쿼리 세트에는"동일하지 않은 "필터 연산자가 없습니다.. (2016 년 4 월 현재)는 "9 년 전에 문을 연다"(장고 석기 시대), "4 년 전에 문을 닫았으며", "5 개월 전에 마지막으로 바뀌었기 때문에"놀랍습니다.

토론을 통해 읽으십시오. 흥미 롭습니다. 기본적으로 어떤 사람들은 논쟁합니다 __ne 다른 사람들이 말하는 동안 추가해야합니다 exclude() 명확하고 따라서 __ne~해야 한다 ~ 아니다 추가됩니다.

(후자의 주장은 파이썬이 없어서는 안된다고 말하는 것과 거의 동일하기 때문에 전자와 동의합니다. != 왜냐하면 그것은 == 그리고 not 이미...)

당신은 사용해야합니다 filter 그리고 exclude 이와 같이

results = Model.objects.exclude(a=true).filter(x=5)

제외 및 필터 사용

results = Model.objects.filter(x=5).exclude(a=true)

마지막 코드는 x! = 5와 a가 참인 모든 객체를 제외합니다. 이 시도:

results = Model.objects.filter(a=False, x=5)

위의 줄의 = 부호는 매개 변수 a에 false를 할당하고 숫자 5는 매개 변수 x에 할당됩니다. 평등을 확인하는 것이 아닙니다. 따라서 실제로 쿼리 호출에! = 기호를 사용하는 방법은 없습니다.

당신이 찾고있는 것은 모든 대상이 있습니다. a=false 또는 x=5. 장고에서 | 역할을합니다 OR 쿼리 세트 사이의 연산자 :

results = Model.objects.filter(a=false)|Model.objects.filter(x=5)

results = Model.objects.filter(a = True).exclude(x = 5)
이 SQL을 제목으로합니다.
select * from tablex where a != 0 and x !=5
SQL은 귀하의 True/False가 표현되는 방식과 데이터베이스 엔진에 따라 다릅니다. Django 코드 만 있으면됩니다.

Django-Model-Values (공개 : 저자)는 명백한 조회 이 답변. 또한 그것에 대한 구문 지원을 제공합니다.

from model_values import F
Model.objects.exclude(F.x != 5, a=True)

이 질문에 대한 잘못된 답변을 많이 조심하십시오!

Gerard의 논리는 정확하지만 쿼리 세트 대신 목록을 반환합니다 (중요하지 않을 수 있음).

쿼리 세트가 필요한 경우 Q를 사용하십시오.

from django.db.models import Q
results = Model.objects.filter(Q(a=false) | Q(x=5))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top