540

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

私ができる場合にのみ:

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

それで、上記に相当するものは何ですか?

4

8 に答える 8

977

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

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が 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 クエリがどのように機能するかをより深く理解できます。

于 2009-05-10T02:41:37.250 に答える
63
Name.objects.filter(alias__gt='',alias__isnull=False)
于 2011-02-23T09:14:06.693 に答える
41

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

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

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

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

これで、探しているセットが得られるはずです。

于 2009-06-04T15:15:18.940 に答える
5

Django 1.8 から、

from django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
于 2016-03-06T12:02:21.147 に答える