1

このコードの場合:

people_pool = People.objects.filter(last_name__in = last_names)
for first_name in first_names:
    for person in people_pool.filter(first_name = first_name):
       # do something with each person. 

djangoクエリセットからの私の理解では、データが「必要」になるまでクエリは実際には実行されないため、連鎖クエリセットの最適化が可能になります。しかし、私が間違っていなければ、それはここで私に不利に働くようです。実行される最初のクエリは、基本的に次と同等になります。

People.objects.filter(last_name__in = last_names, first_name = first_name) # for the first first_name in first_names

また、データベースはすべての名について照会する必要があります。この場合、Djangoに実際にを取得させpeople_pool、取得したpythonオブジェクトに対して後続のフィルターを実行させ、DBをそのままにしておく適切な方法は何ですか?

4

1 に答える 1

2

名ごとにdbクエリを実行しないための唯一の方法は、Pythonで実際のフィルタリングを実行することです。

people_pool = People.objects.filter(last_name__in = last_names)
people = {}

for person in people_pool:
    first_name = person.first_name
    if first_name in first_names:
        if not first_name in people:
            people[first_name] = []
        people[first_name].append(person)

for first_name, people_first_name in people.items():
    for person in people_first_name:
        # do something with each person

必要に応じて、最初のループ()で何かを実行することもできますfor person in people_pool。私はただ人を追加しますdictが、そのステップは必要ありません。

于 2012-10-14T02:18:57.703 に答える