通过 Django ORM 重命名嵌套注释字段

Posted

技术标签:

【中文标题】通过 Django ORM 重命名嵌套注释字段【英文标题】:Rename nested annotated field via Django ORM 【发布时间】:2018-06-18 19:18:58 【问题描述】:

是否可以使用 for group by 子句重命名嵌套字段?

这个查询:

paymentitem.objects.filter(payment=p).values('item__vat_tax').annotate(base=models.Sum('price')).order_by('item__vat_tax')

返回预期数据:

<QuerySet ['base': Decimal('41.322'), 'item__vat_tax': 15, 'base': Dec
    imal('483.470'), 'item__vat_tax': 21]>

我想将字段“item__vat_tax”重命名为“vat”。这个查询:

paymentitem.objects.filter(payment=p).extra(select='vat': 'item__vat_tax').values('item__vat_tax').annotate(base=models.Sum('price')).order_by('vat')

返回相同的结果,但出乎意料地由 vat 排序。

如果我更改 value 语句中的字段名称,则会引发错误。

【问题讨论】:

这个答案可能对***.com/a/32580991/548562有帮助 是的,它适用于 F 表达式。非常感谢。 【参考方案1】:

解决办法是用F表达式:

paymentitem.objects.filter(payment=p).values(vat=F('item__vat_tax')).annotate(base=models.Sum('price')).order_by('vat')

【讨论】:

【参考方案2】:

在 Django 中重命名注释值名称。如果我们使用 Django F 表达式,那么很容易解决这个问题。

from django.db.models import F 
paymentitem.objects.filter(payment=p).values(vat=F('item__vat_tax')).annotate(base=models.Sum('price')).order_by('vat')

返回预期数据

<QuerySet ['base': Decimal('41.322'), 'vat': 15, 'base': Decimal('483.470'), 'vat': 21]>

【讨论】:

以上是关于通过 Django ORM 重命名嵌套注释字段的主要内容,如果未能解决你的问题,请参考以下文章