如何为 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 获取正确的查询集的主要内容,如果未能解决你的问题,请参考以下文章

如何为 DataTable 中的每一行设置/获取自定义数据

如何为可编辑日期设置正确的日期格式

如何为Serializer分页查询集

如何为mysql中的现有表创建索引?

如何为 DataTable.RowChanged 事件代码设置 DataContext

如何为 dataTable 中的不同操作选择图像?