web-dev-qa-db-ja.com

クエリー内の空の名前またはNULL名のフィルターリング

First_name、last_name、およびエイリアス(オプション)を検索する必要があります。そのため、エイリアスが設定されているすべての名前を取得するためのクエリが必要です。

私ができる場合に限ります。

Name.objects.filter(alias!="")

それで、上記と同等のものは何ですか?

418
un33k

あなたはこれをすることができます:

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_fieldother_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を見てください。

762
Sasha Chedygov
Name.objects.filter(alias__gt='',alias__isnull=False)
37
jbofill

まず、Djangoのドキュメントでは、CharFieldやTextFieldなどの文字列ベースのフィールドにNULL値を使用しないことを強くお勧めします。説明については文書を読んでください。

https://docs.djangoproject.com/en/dev/ref/models/fields/#null

解決策:QuerySetsのメソッドを連鎖させることもできます。これを試して:

Name.objects.exclude(alias__isnull=True).exclude(alias="")

それはあなたが探しているセットをあなたに与えるはずです。

35
b3ng0

Django 1.8から、

from Django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
4

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 =' ')

2
HoangYell

これを簡単に実行できます。

Name.objects.exclude(alias="").exclude(alias=None)

それは本当にとても単純です。 filterは一致させるために使用され、excludeは指定されたもの以外はすべて一致させるために使用されます。これはNOT alias='' AND alias IS NOT NULLとしてSQLに評価されます。

0
Tim Tisdall

これはそれをするもう一つの簡単な方法です。

Name.objects.exclude(alias=None)
0
ImadOS