1. ホーム
  2. django

[解決済み] QuerySetで空白またはNULLの名前をフィルタリングする方法は?

2022-03-18 17:46:30

質問

私は first_name , last_name & alias (オプション) を検索する必要があります。つまり、エイリアスが設定されているすべての名前を取得するためのクエリーが必要です。

できればの話ですが。

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

では、上記に相当するものは何でしょうか?

どのように解決するのですか?

こんなこともできるんですね。

Name.objects.exclude(alias__isnull=True)

null 値を除外する必要がある場合 のような空文字列の場合、このように条件を連結するのが望ましい。

Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')

これらのメソッドを連結することで、基本的にそれぞれの条件を個別にチェックすることができます。 alias がNULLであるか または は空の文字列なので、すべての Name オブジェクトは、NULLでなく、空でない 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 が真である行は除外されるので、両方のフィールドが真でない行がすべて取得されます。生成された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 docs に追加しました。

<サブ 余談ですが 私のSQLの例は単なるアナロジーであり、実際に生成されるSQLコードはおそらく異なるものになるでしょう。実際に生成された SQL を見ることで、 Django のクエリがどのように動作するのか、より深く理解できるでしょう。