通常のpythonセットのようですか?
次のクエリセットがあるとします
entry_set = Entry.objects.all()
エントリオブジェクトeがentry_setに存在するかどうかを確認するにはどうすればよいですか?
次のコードを使用できます。
if e in Entry.objects.all():
#do something
または最善のアプローチ:
if Entry.objects.filter(id=e.id).exists():
#do something
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のパフォーマンスが大幅に低下することに注意してください。このプラクティスを回避することで、アプリケーションの数十秒が改善された事例をすでに見ました。
in
演算子を使用できます。
entry_set = Entry.objects.all()
if an_entry in entry_set:
# The element present.
エントリモデルに存在する一意のキーに基づいてクエリセットをフィルタリングするだけです。たとえば、そのキーがidの場合、コードは次のようになります。
is_present = Entry.objects.filter(id=e.id)
if is_present:
print "Present"
else:
print "Not Present"