others - Django queryset过滤怎么实现不等于?

例如:


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)

时间:

我只是尝试了一下,似乎工作得很好:


>>> 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>, ...]


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

Django支持以下运算符:


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

使用这些模型时,可以使用=,__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')

尝试这个:


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

使用Django 1.7创建自定义查找很容易,这里有一个__ne查找例子Django官方文档

你需要首先创建查找本身:


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)

...