장고 모델 검색어 세트, 나는 거기 것을 볼 __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 세 가지 옵션이 있습니다.
-
results = Model.objects.exclude(a=true).filter(x=5)
-
from django.db.models import Q object_list = QuerySet.filter(~Q(a=True), x=5)
-
맞춤 검색 기능 등록
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
이미 가지고 있기 때문에 파이썬이 가지고 있지 않아야한다고 말하는 것과 거의 동일하기 때문에 전자에 동의합니다 …)