我正在尝试提高应用程序的一部分的性能。最简单的处理逻辑的方式对数据库来说也是最不友好的。我编写的代码越多,我就越觉得我使情况变得过于复杂。
表现不佳(原因显而易见)
ids = [1,2,3,4,5,6,7,9,10]
for id in ids:
results = MyTable.objects.filter(id=id)
for item in results:
doProcessing(item)
我的 ids 列表很容易变得很大,这当然会导致数据库受到大量点击。但是,我很容易知道结果列表仅适用于指定的 id。
尝试改进(未成功)
ids = [1,2,3,4,5,6,7,9,10]
results = MyTable.objects.filter(id__in=ids)
for item in results:
doProcessing(item)
这就是我想做的事情的基础。但显然迭代会给我所有 id 的所有结果。我仍然需要能够处理与组具有相同 id 的所有结果。
最后我想我仍然需要一个包含给定 id 的结果的列表。然后我处理整个列表,然后继续处理下一个列表。
我只是找不到一种干净的方法来分离具有相同 id 的结果组。
最佳答案
Django ORM 并没有直接公开我能想到的执行此操作的方法,但如果您有数据库为您进行排序,您至少可以将项目预先分组到查询集中。
因此,我将使用 itertools.groupy 来做到这一点在查询集上使用 .order_by(id)
按 id 对元素进行分组后,处理将具有相同 id 的值组织到共享迭代中:
import itertools
import operator
ordered_results = MyTable.objects.filter(id__in=ids).order_by('id')
for (shared_id, items) in itertools.groupby(ordered_results, operator.attrgetter('id')):
# whatever your per-group processing is here
关于python - 如何最好地迭代具有不断变化的 id 的查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57138667/