通过 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可以嵌套么,字段的重命名可以用中文么