1

クエリセットを評価してからフィルターを呼び出す方法はありますか? この例ではデータベースに一度だけアクセスしたい

例:

qs = Model.objects.all()

for element in array:
  current = qs.filter(name=element)
4

3 に答える 3

2

ここでの呼び出しqs.filter()は、 w/ とは関係のない新しいクエリセットを生成しますqsまた、 doc
に従って、特定の操作まで未評価のままにします。qscurrent

于 2012-12-03T13:18:15.900 に答える
1

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)
于 2012-12-03T13:52:05.843 に答える
0

データベースへの 1 回のヒットでクエリを作成する場合は、Q オブジェクトを使用する必要があります。

from django.db.models import Q
q = Q()
for element in array:
    q &= Q(name=element)
qs = Model.objects.filter(q)
于 2012-12-03T19:35:38.977 に答える