如何为 Datatable 获取正确的查询集
Posted
技术标签:
【中文标题】如何为 Datatable 获取正确的查询集【英文标题】:How to get correct queryset for Datatable 【发布时间】:2020-05-01 17:24:36 【问题描述】:我有两个模型,个人资料和付款。我需要在前端显示一个包含“用户名”、“电子邮件”和“总花费”字段的数据表。用户名和电子邮件可以在 Profile 模型中找到,因此查询集将是:
def get_initial_queryset(self):
return Profile.objects.all()
但是,“总花费”信息需要计算为相同“profile_id”的付款模型中所有“payment_amount”字段的总和,因为用户可以有两个付款(一个金额=5,另一个一个金额=15,我需要显示total_spent=20)。
问题是,由于我使用的是 Datatables,我需要这个“total_spent”字段在查询集中(使用 Annotate 或其他方法)。 p>
我尝试过使用 Subquery 和 OuterRef,但在生成的最终 SQL 中出现错误。
return Profile.objects.all().annotate(
money_spent=Subquery(
Payment.objects.filter(user_id__in=OuterRef('id')).annotate(
money_spent=Sum('amount')
),
output_field=CharField()
)
)
但这给了我 SQL 错误:(1241, 'Operand should contain 1 column(s)')
我怎样才能得到正确的查询集?
Django 版本:1.11 | Python 版本:3.6.8
【问题讨论】:
提示:你的初始查询集应该是 Payment.objects.all() 【参考方案1】:你根本不需要做子查询,你可以在docs regarding joins and aggregates查看更多
Profile.objects.annotate(money_spent=Sum('payment__amount'))
这会导致跟随
SELECT profile.*, SUM(payment.amount) AS money_spent
FROM profile
LEFT OUTER JOIN payment ON payment.profile_id = profile.id
GROUP BY profile.id
【讨论】:
效果很好,没想到会这么简单。我会更加关注文档。非常感谢。以上是关于如何为 Datatable 获取正确的查询集的主要内容,如果未能解决你的问题,请参考以下文章