gpt4 book ai didi

python - ModelAdmin 查询集中跨多个表的 Django 聚合

转载 作者:太空宇宙 更新时间:2023-11-03 12:08:23 25 4
gpt4 key购买 nike

Django 代码和 Django 错误报告引用

给出如下三个模型(为演示过度简化......实际上不是相同的相关模型)

class derp(models.Model):
...
class derp_related_1(models.Model):
fk = models.ForeignKey(derp)
amount = models.DecimalField(max_digits=15, decimal_places=2)
class derp_related_2(models.Model):
fk = models.ForeignKey(derp)
amount = models.DecimalField(max_digits=15, decimal_places=2)

并按如下方式覆盖模型管理中的查询集。 (由于 this django bug 而无法正常工作。)

class DerpAdmin(admin.ModelAdmin):
...
list_display = ['derp_r1_sum', 'derp_r2_sum']
...
def queryset(self, request):
qs = super(DerpAdmin, self).queryset(request)
qs = qs.annotate(derp_r1_sum=models.Sum('derp_r1__amount', distinct=True))
qs = qs.annotate(derp_r2_sum=models.Sum('derp_r2__amount', distinct=True))
def derp_r1_sum(self, obj):
return u'%s' % obj.derp_r1_sum
def derp_r2_sum(self, obj):
return u'%s' % obj.derp_r2_sum

意外数据库结果示例

单独运行注释会呈现类似(删除分组和总和)

+---------+--------+
| derp.id | r1_sum |
+---------+--------+
| 2 | 500.00 |
| 2 | 100.00 |
+---------+--------+
r1_sum would be 600.00
and
+---------+--------+
| derp.id | r1_sum |
+---------+--------+
| 2 | 100.00 |
| 2 | 250.00 |
+---------+--------+
r2_sum would be 350.00

如果您采用包含两个注释的 qs.query 并删除总和和分组,那么很明显问题出在哪里。在这种情况下,我们对所有内容都进行了两次计数。获得更多关系,我们在两个总和列中的增长越来越难看。

+---------+--------+--------+
| derp.id | r1_sum | r2_sum |
+---------+--------+--------+
| 2 | 500.00 | 100.00 |
| 2 | 500.00 | 250.00 |
| 2 | 100.00 | 100.00 |
| 2 | 100.00 | 250.00 |
+---------+--------+--------+
r1_sum would incorrectly be 1200.00
r2_sum would incorrectly be 700.00

请问,除了自定义SQL,还有其他路由吗?

我自己可以很容易地编写查询,但如果有人有建议可以避免编写自定义 SQL,那将是很棒的。

感谢您的帮助。

编辑:这是指向 Django 文档注释部分的链接。一位评论者提到了不同的选项。这不起作用,我相信这是 django documentation on annotation 注释部分底部的警告。 .

Edit2: 原始 SQL 想法可能比我想象的更难,因为 derp.objects.raw('sql here') 不返回管理员使用它所必需的查询集对象。有没有办法使用两个查询(真正的查询集加上一个自定义的查询集)并从两者填​​充 ListView ?我发现的一个建议(我现在找不到了:S)建议创建一个映射到模型定义的 View ,然后将其设置为不受 django 管理(对于 syncdb)。然后我可以编写我的自定义代码,并引用它以包含在原始查询中。这听起来很乱。想法?

最佳答案

如果您想留在 Django 的查询集中,我会考虑创建一个共享相关和公共(public)字段的模型父类(super class),并进行子类化以进一步区分。否则,您需要编写自定义 SQL 或完全脱离数据库 ORM,并使用 Queryset.valuesQueryset.values_list

在 python 中操作您的数据

关于python - ModelAdmin 查询集中跨多个表的 Django 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com