クエリセットを評価してからフィルターを呼び出す方法はありますか? この例ではデータベースに一度だけアクセスしたい
例:
qs = Model.objects.all()
for element in array:
current = qs.filter(name=element)
クエリセットを評価してからフィルターを呼び出す方法はありますか? この例ではデータベースに一度だけアクセスしたい
例:
qs = Model.objects.all()
for element in array:
current = qs.filter(name=element)
ここでの呼び出しqs.filter()
は、 w/ とは関係のない新しいクエリセットを生成しますqs
。また、 doc
に従って、特定の操作まで未評価のままにします。qs
current
Python でフィルタリングできます。
qs = Model.objects.all()
for element in array:
current = filter(lambda x: x.name==element, qs)
ただし、クエリセットと配列が大きい場合、これは非効率的です。または、要素ごとにクエリセットをグループ化できます。
from collections import defaultdict #
qs = Model.objects.all()
grouped = defaultdict(list)
for obj in qs:
grouped[obj.name].append(obj)
for element in array:
current = grouped[element]
array
値の小さなサブセットのみが含まれている場合はname
、クエリセットを制限することが理にかなっています。
qs = Model.objects.filter(name__in=array)
データベースへの 1 回のヒットでクエリを作成する場合は、Q オブジェクトを使用する必要があります。
from django.db.models import Q
q = Q()
for element in array:
q &= Q(name=element)
qs = Model.objects.filter(q)