【问题标题】:Rename nested annotated field via Django ORM通过 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 语句中的字段名称,则会引发错误。

【问题讨论】:

标签: django django-orm django-annotate


【解决方案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}]>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2014-10-12
      • 2011-06-04
      • 2021-05-25
      • 2021-10-23
      • 2016-01-03
      • 2017-06-14
      相关资源
      最近更新 更多