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_reason
是 ForeignKey
,而 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正确的值。
我有两个几乎相等的测试查询:
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_reason
是 ForeignKey
,而 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正确的值。