Django ORM 查询重复注释值

Django ORM query duplicates annotated values

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

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') returns <QuerySet [{'plan_total': Decimal('658.00')}]> 的结果,但是当我尝试获得与 test2.values('plan_total') 相同的值时,它 returns <QuerySet [{'plan_total': Decimal('1316.00')}]> . 怎么会这样?

关于以上字段的更多信息:

item_reasonForeignKey,而 planned_bank_operations 是相关查询,由 PlanOperation 模型中的 related_name 关联。

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

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

在我找到文章 https://docs.djangoproject.com/en/2.1/ref/models/querysets/#order-by 的注释后,我认为问题出在 SQL 和 GROUP_BY。

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

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')returns正确的值。