python - 如何通过按键组合多个查询集?

标签 python django performance postgresql django-queryset

我有几个必须有效组合的查询集。所有查询集都有公共(public)字段 key ,我想按其值查询结果连接起来。例如:

some_query = SomeObject.objects.values('key').annotate(sum_0=Sum('some_value_field'))
other_query = OtherObject.objects.values('key', 'other_field').annotate(sum_1=Sum('some_other_value_field'))

我有什么:

[{'key': 1, 'sum_0': 10}, {'key': 2, 'sum_0': 20}, ...]
[{'key': 1, 'sum_1': 1000}, {'key': 2, 'sum_1': 200}, ...]

我想要的:

[{'key': 1, 'sum_0': 10, 'sum_1': 100}, {'key': 2, 'sum_0': 20, 'sum_1': 200}, ...]

我正在使用这种方法来组合字典:

d = defaultdict(dict)
for item in [some_query, other_query]:
    for elem in item:
        d[elem['key']].update(elem)
combined = d.values()

除了通过遍历每个查询集的字典合并之外,是否有更有效的方法来完成此操作,或者是否有一种方法可以通过 key 将这些查询集组合成查询本身的一个结果?

最佳答案

您可以组合注释以仅执行一个数据库操作:

SomeObject.objects.values('key', 'other_field').annotate(sum_0=Sum('some_value_field'), sum_1=Sum('some_other_field'))

关于python - 如何通过按键组合多个查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37162009/

相关文章:

c# - 将对象转换为相同类型以及对性能的影响

iphone - 核心数据迁移非常慢,为什么会发生这种情况?

python - Matplotlib 中的 3D 参数化曲线不遵循 zorder。解决方法?

python - 如何在 Django 1.9 中设置 "simple"密码

python - 在 OpenCV Python 中运行 solvePnP 时出错

python - 未找到命令 : django

Django 干草堆 : writing a whoosh index to an S3 Bucket?

r - 如何在大数据帧中快速转换不同的时间格式?

python - 如何在 Python 中构建一个所有值都是 [] 的独立实例的字典?

python - 为什么如果使用列表理解该函数不会更新列表,但在使用 for 循环时会更新列表