回答:
あなたはこれを行うことができます:
Name.objects.exclude(alias__isnull=True)
null値と空の文字列を除外する必要がある場合は、次のように条件を連結することをお勧めします。
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
これらのメソッドを一緒にチェーンすると、基本的に各条件が個別にチェックされます。上記の例でalias
は、がnull または空の文字列の行を除外するため、null でも空Name
でもないalias
フィールドを持つすべてのオブジェクトを取得できます。生成されたSQLは次のようになります。
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
への1回の呼び出しに複数の引数を渡すこともできexclude
ます。これにより、すべての条件を満たすオブジェクトのみが確実に除外されます。
Name.objects.exclude(some_field=True, other_field=True)
ここでは、some_field
と other_field
trueの行が除外されるため、両方のフィールドがtrueではないすべての行が取得されます。生成されたSQLコードは次のようになります。
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
または、ロジックがそれよりも複雑な場合は、DjangoのQオブジェクトを使用できます。
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
詳細については、このページとDjangoドキュメントのこのページを参照してください。
余談ですが、私のSQLの例は類推にすぎません。実際に生成されたSQLコードはおそらく異なって見えます。Djangoクエリが生成するSQLを実際に確認することで、Djangoクエリがどのように機能するかをより深く理解できます。
OR
条件を融合するためにを使用することが保証されることを意味していませんでした。明確にするために回答を編集します。
NOT (A AND B)
はと同等NOT A OR NOT B
です。SQLを知っているがORMに慣れていない新しいDjango開発者を混乱させるものだと思います。
AND
は、最初のクエリのをに変換するOR
ことを利用するためにのみ機能しますexclude
。一般的なケースでは、チェーンをTHEN
、つまりと考える方がおそらく正しいでしょうexclude(A) THEN exclude(B)
。上記の過酷な言語については申し訳ありません。あなたの答えは本当に良いですが、私は新しい開発者があなたの答えをあまりにも一般的に受け入れるのを心配しています。
AND
とOR
SQLの背景からジャンゴに来て誰かのために役に立つかもしれません。Djangoをより深く理解するために、ドキュメントは私よりも優れていると思います。
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=False
条件は冗長だと思います。フィールドがNull
確かにある場合、最初の句によって除外されますか?
alias__gt
私のようなJSONから空の文字列を除外したいJSON型の列のために働いていただけのものでした{'something:''}
。だから、作業構文は次のとおりです。jsoncolumnname__something__gt=''
まず、Djangoのドキュメントでは、CharFieldやTextFieldなどの文字列ベースのフィールドにNULL値を使用しないことを強く推奨しています。説明については、ドキュメントをご覧ください。
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
解決策:QuerySetsのメソッドをチェーンすることもできます。これを試して:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
それはあなたが探しているセットをあなたに与えるはずです。
Django 1.8から、
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
を使用するときによくある間違いを避けるために、次の点に注意してくださいexclude
。
のようにexclude()ブロックに複数の条件を追加することはできません。複数の条件を除外するには、複数のexclude()を使用する必要がありますfilter
例
不正:
User.objects.filter(email='example@example.com ')。exclude(profile__nick_name =' '、profile__avt =' ')
正解:
User.objects.filter(email='example@example.com ')。exclude(profile__nick_name =' ')。exclude(profile__avt =' ')
あなたは単にこれを行うことができます:
Name.objects.exclude(alias="").exclude(alias=None)
それは本当にそれほど単純です。 filter
一致するために使用されexclude
、それが指定するもの以外すべてに一致します。これはSQLとして評価されますNOT alias='' AND alias IS NOT NULL
。
alias=""
)およびNULL(alias=None
)エイリアスを除外することを目的としています。あなたのインスタンスにはが含まれますName(alias=None)
。
.filter(alias!="")
、タイトルではなく同等のものに答えていました。回答を編集しました。ただし、文字フィールドはNULL値を許可してはならず、非値には空の文字列を使用する必要があります(規則に従って)。
OR
ず(この場合のみ)、SQLを生成しますAND
。このページを参照してください:docs.djangoproject.com/en/dev/topics/db/queries/…チェーンの利点は、複雑なクエリ条件を混合exclude
しfilter
てモデル化できることです。実際のSQLをモデル化するOR
場合は、Django Qオブジェクトを使用する必要があります:docs.djangoproject.com/en/dev/topics/db/queries/… 編集内容を編集してこれを反映してください。 。