在Django模型QuerySets中,我看到有一個__gt
和__lt
用於比較值,可是有一個__ne
/ !=
/ <>
( 不等於 ?) python
我想用不等於過濾掉: sql
例: django
Model: bool a; int x;
我想要 app
results = Model.objects.exclude(a=true, x!=5)
!=
語法不正確。 我試過__ne
, <>
。 spa
我最終使用: code
results = Model.objects.exclude(a=true, x__lt=5).exclude(a=true, x__gt=5)
也許Q對象能夠幫助解決這個問題。 我歷來沒有使用它們,但彷佛它們能夠被否認和組合,就像普通的python表達式同樣。 對象
更新:我剛試了一下,看起來效果很好: ci
>>> 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>, ...]
查詢中的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建議您將得到幾乎任何可能的查詢所需的內容。 get
使用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)
您應該像這樣使用filter
和exclude
results = Model.objects.exclude(a=true).filter(x=5)
在Django 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
在Django 1.8中添加了register_lookup
裝飾器並像往常同樣啓用自定義查找:
results = Model.objects.exclude(a=True, x__ne=5)