Django ORM查询重复带注释的值

时间:2018-12-18 05:32:39

标签: django django-models django-orm

我有两个几乎相等的测试查询:

test1 = (
Invoice.objects
    .filter(id=2787)
    .annotate(plan_total=Sum(
        'item_reason__planned_bank_operations__amount')
    ))

test2 = (
Invoice.objects
    .filter(id=2787)
    .annotate(
        plan_total=Sum(
            'item_reason__planned_bank_operations__amount'),
        pieces_total=Sum(
            'invoice_pieces__amount')
    ))

test1.values('plan_total')的结果返回<QuerySet [{'plan_total': Decimal('658.00')}]>,但是当我尝试获取相同的test2.values('plan_total')值时,它返回<QuerySet [{'plan_total': Decimal('1316.00')}]>。 这怎么可能发生?

有关上述字段的更多信息:

item_reason是由ForeignKey模型中的related_name关联的相关查询时,

planned_bank_operationsPlanOperation

invoice_pieces的历史相同。 InvoicePiece是具有相关名称InvoicePieces的ForeignKey到发票的单个模型。

所以,我无法理解这种行为。这是错误还是功能?

1 个答案:

答案 0 :(得分:0)

找到文章https://docs.djangoproject.com/en/2.1/ref/models/querysets/#order-by的注释后,我建议问题出在使用GROUP_BY生成的SQL中。

我通过子查询解决了这个问题:

test2_subquery = (
InvoiceAmountInProject.objects
    .filter(base_invoice__id=OuterRef('id'))
    .values('base_invoice__id')
    .annotate(total=Sum('amount'))
    .values('total'))

test2 = (
Invoice.objects
    .filter(id=2787)
    .annotate(
        plan_total=Sum('item_reason__planned_bank_operations__amount'),
        pieces_total=Subquery(test2_subquery)
    ))

现在test2.values('plan_total')返回正确的值。