web-dev-qa-db-ja.com

Djangoクエリセットに要素が存在するかどうかを確認する方法は?

通常のpythonセットのようですか?

次のクエリセットがあるとします

entry_set = Entry.objects.all()

エントリオブジェクトeがentry_setに存在するかどうかを確認するにはどうすればよいですか?

14
Brian

次のコードを使用できます。

if e in Entry.objects.all():
        #do something

または最善のアプローチ:

if Entry.objects.filter(id=e.id).exists():
        #do something
23
Siddharth Gupta

Djangoドキュメントによると、最良のアプローチ: https://docs.djangoproject.com/en/2.1/ref/models/querysets/#exists

_if Entry.objects.filter(id=item.id).exists():
    # Do something
_

しかし、あなたも行うことができます:

_if item in Entry.objects.all():
    # Do something
_

このアプローチは可能な限りworserですが。クエリセット全体をループして、データベースから要素を1つずつプルするため、ほとんどすべてがデータベースレベルで行われる他のアプローチと比較して、.

IDのリストまたはクエリセットがある場合、他のアプローチは___in_を使用することになります

クエリセットの例:

_query_ids = other_queryset.values_list('field_id', flat=True)
if Entry.objects.filter(id__in=query_ids).exists():
    # Do something
_

または、IDのリストがある場合:

_if Entry.objects.filter(id__in=[1, 2, 3, 4, 5]).exists():
    # Do something
_

len(queryset)、_item in queryset_またはlist(queryset)を実行するたびに、Djangoのパフォーマンスが大幅に低下することに注意してください。このプラクティスを回避することで、アプリケーションの数十秒が改善された事例をすでに見ました。

8
Renato César

in演算子を使用できます。

entry_set = Entry.objects.all()
if an_entry in entry_set:
    # The element present.
1
falsetru

エントリモデルに存在する一意のキーに基づいてクエリセットをフィルタリングするだけです。たとえば、そのキーがidの場合、コードは次のようになります。

is_present = Entry.objects.filter(id=e.id)
if is_present:
    print "Present"
else:
    print "Not Present"
0
Animesh Sharma