838

DjangoモデルのQuerySetsには、比較値のとがありますが、__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)
4

16 に答える 16

918

これにはQ オブジェクトを使用できます。それらは演算子で否定され、~通常の Python 式と同じように組み合わせることができます:

from myapp.models import Entry
from django.db.models import Q

Entry.objects.filter(~Q(id=3))

3ID として次のものを除くすべてのエントリを返します。

[<Entry: Entry object>, <Entry: Entry object>, <Entry: Entry object>, ...]
于 2009-07-20T17:58:38.883 に答える
733

クエリには二重否定があるようですx。5 ではないすべての行を除外したいので、5 であるすべての行を含めたいx 考えています。これでうまくいくと思います。

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

特定の質問に答えるために、「等しくない」フィールドルックアップはありませんが、おそらくDjangoにはfilterexcludeメソッドの両方があり、いつでもロジックを切り替えて目的の結果を得ることができるためです。

于 2010-11-09T23:56:13.523 に答える
150

クエリのfield=value構文は の省略形ですfield__exact=value。つまり、Django は識別子のクエリ フィールドにクエリ演算子を配置します。Django は次の演算子をサポートしています。

exact
iexact
contains
icontains
in
gt
gte
lt
lte
startswith
istartswith
endswith
iendswith
range

date
year
iso_year
month
day
week
week_day
iso_week_day
quarter
time
hour
minute
second

isnull
regex
iregex

これらをDave Vogt が提案する Q オブジェクトと組み合わせて orを使用することで、filter()またはJason Baker が提案するように、ほぼすべての可能なクエリに必要なものを正確に取得できると確信しています。exclude()

于 2009-07-20T18:07:02.423 に答える
131

次の 3 つのオプションがあります。

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

    通常どおり使用できます。

    results = Model.objects.exclude(a=True, x__ne=5)
    
于 2016-02-24T13:12:47.010 に答える
48

、、、、、でモデルをフィルタリングすることはできますが=、またはを使用することはできません。ただし、Qオブジェクトを使用すると、より適切なフィルタリングを実現できます。__gt__gte__lt__ltene!=

チェーンQuerySet.filter()とを回避しQuerySet.exclude()、これを使用できます。

from django.db.models import Q
object_list = QuerySet.filter(~Q(field='not wanted'), field='wanted')
于 2011-01-18T14:34:16.470 に答える
27

保留中のデザイン決定。その間、使用exclude()

Django イシュー トラッカーには、「Queryset does not have a "not equal" filter operator」というタイトルの注目すべきエントリ #5763があります。(2016 年 4 月現在) 「9 年前にオープン」(Django 石器時代)、「4 年前にクローズ」、「最後に変更されたのは 5 か月前」であるため、注目に値します。

議論を読んで、それは興味深いです。基本的に、__ne追加すべきだと主張する人もexclude()いれば、追加す__ne べきではないと主張する人もいます。

!=(私は前者に同意します。なぜなら、後者の議論は、Pythonには既にあるので、あるべきではないと言っているのとほぼ同じだから==ですnot...)

于 2016-04-21T08:44:38.413 に答える
16

あなたはこれfilterを使うべきですexclude

results = Model.objects.exclude(a=true).filter(x=5)
于 2015-09-25T08:52:02.660 に答える
7

コードの最後のビットは、x!=5 で a が True であるすべてのオブジェクトを除外します。これを試して:

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

上記の行の = 記号は、パラメーター a に False を割り当て、パラメーター x に数値 5 を割り当てていることを思い出してください。同等性をチェックしているわけではありません。したがって、クエリ呼び出しで != 記号を使用する方法は実際にはありません。

于 2009-03-26T19:54:05.923 に答える
7

結果 = Model.objects.filter(a = True).exclude(x = 5)
次の SQL を生成します。
select * from tablex where a != 0 and x !=5
SQL は、True/False フィールドの表現方法とデータベース エンジンによって異なります。ただし、必要なのは django コードだけです。

于 2017-02-22T12:12:00.773 に答える