카테고리 보관물: Python

Python

Django 쿼리 세트 필터링에서 동일하지 않은 방법은 무엇입니까? 장고 모델 검색어

장고 모델 검색어 세트, 나는 거기 것을 볼 __gt__lt비교급 값을하지만,이 __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 IS 5 인 모든 행을 포함하려고합니다. 이것은 트릭을 수행 할 것이라고 믿습니다.

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

특정 질문에 대답하기 위해 “같지 않음”은 없지만 django에 “filter”및 “exclude”메소드를 모두 사용할 수 있기 때문에 원하는 결과를 얻기 위해 항상 로직 라운드를 전환 할 수 있습니다.


답변

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 객체와 이들을 결합하여 확신 데이브 보그 알 수 및 사용 filter()또는 exclude()제이슨 베이커는 제안 당신은 단지에 대한 가능한 모든 쿼리에 필요한 정확히 무엇을 얻을 수 있습니다.


답변

Django 1.7을 사용하여 사용자 지정 조회를 쉽게 만들 수 있습니다. Django 공식 문서 에는 __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)

답변

에서 장고 1.9 / 1.10 세 가지 옵션이 있습니다.

  1. 체인 excludefilter

    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. 맞춤 검색 기능 등록

    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 이슈 트래커에는 “Queryset에”같지 않은 “필터 연산자가 없습니다” 라는 놀라운 항목 # 5763 이 있습니다 . 그것은 (2016 년 4 월 현재) “장고 석기 시대에 9 년 전”, “4 년 전에 문을 닫음”, “5 개월 전에 마지막으로 변경됨”으로 인해 주목할 만하다.

토론을 읽으면 흥미 롭습니다. 기본적으로 어떤 사람들 __ne은 추가해야 한다고 주장 하지만 다른 사람들 exclude()은 더 명확 하다고 말하면 추가 __ne
해서는 안됩니다 .

(나는 후자의 주장이 파이썬이 !=가지고 ==있고 not이미 가지고 있기 때문에 파이썬이 가지고 있지 않아야한다고 말하는 것과 거의 동일하기 때문에 전자에 동의합니다 …)