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

时间:2018-01-09 17:21:44

标签: django django-orm django-annotate

是否可以使用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语句中的字段名称,则会引发错误。

2 个答案:

答案 0 :(得分:1)

解决方案是使用F表达式:

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

答案 1 :(得分:0)

在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}]>