如何在Django查詢集過濾中作不相等的操做?

在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)

#1樓

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

#2樓

查詢中的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


#3樓

使用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)

#4樓

您應該像這樣使用filterexclude

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

#5樓

Django 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

    Django 1.8中添加了register_lookup裝飾器並像往常同樣啓用自定義查找:

    results = Model.objects.exclude(a=True, x__ne=5)
相關文章
相關標籤/搜索