First_name、last_name、およびエイリアス(オプション)を検索する必要があります。そのため、エイリアスが設定されているすべての名前を取得するためのクエリが必要です。
私ができる場合に限ります。
Name.objects.filter(alias!="")
それで、上記と同等のものは何ですか?
あなたはこれをすることができます:
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 != ""
exclude
への1回の呼び出しに複数の引数を渡すこともできます。これにより、 every 条件を満たすオブジェクトのみが除外されるようになります。
Name.objects.exclude(some_field=True, other_field=True)
ここでは、some_field
と other_field
が真である行は除外されるので、両方のフィールドが真でないすべての行を取得します。生成された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を見てください。
Name.objects.filter(alias__gt='',alias__isnull=False)
まず、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
を使用する際のよくある間違いを避けるため、覚えておいてください:
次のことができますnot add multiple条件をexclude()filter
のようなブロック。複数の条件を除外するには、複数のexclude()を使用する必要があります
例
不正解:
User.objects.filter(email='[email protected] ')。exclude(profile__nick_name =' '、profile__avt =' ')
正しい:
User.objects.filter(email='[email protected] ')。exclude(profile__nick_name =' ')。exclude(profile__avt =' ')
これを簡単に実行できます。
Name.objects.exclude(alias="").exclude(alias=None)
それは本当にとても単純です。 filter
は一致させるために使用され、exclude
は指定されたもの以外はすべて一致させるために使用されます。これはNOT alias='' AND alias IS NOT NULL
としてSQLに評価されます。
これはそれをするもう一つの簡単な方法です。
Name.objects.exclude(alias=None)