通过 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 重命名嵌套注释字段的主要内容,如果未能解决你的问题,请参考以下文章

MySql语句中select可以嵌套么,字段的重命名可以用中文么

如何在 Django Admin 中为作为方法//属性的字段重命名列标签?

oracle 查询数据重命名为汉字对效率有影响吗?

使用 virtualenvwrapper 重命名环境

嵌套对象解构和重命名

如何使用注释在 Django ORM 中创建通知日期字段