python - 如何最好地迭代具有不断变化的 id 的查询集?

标签 python django

我正在尝试提高应用程序的一部分的性能。最简单的处理逻辑的方式对数据库来说也是最不友好的。我编写的代码越多,我就越觉得我使情况变得过于复杂。

表现不佳(原因显而易见)

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/

相关文章:

python - 根据系列或数组中的索引访问 pandas 字符串列字符

python - Python 中的函数如何在返回后记住它的值?

python - 如何从 Dataframe 列形成元组列表

python - 如何使用redis for python在Redis中搜索值

django - 运行 django 测试时如何修复 "TypeError: argument of type ' ConnectionHandler' is not iterable”?

python - 如何在 Django 中构建 DRY 图像库

python - django - 仅适用于特定用户组的可访问 url 模式

python - 函数的列表理解语法

django - 在 Django-Admin 中通过 row-id 对显示项进行排序

django - 如何使用 Win 7 XP 模式调试 Django 站点?