我有两个几乎相等的测试查询:
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_operations
是PlanOperation
。
与invoice_pieces
的历史相同。 InvoicePiece
是具有相关名称InvoicePieces
的ForeignKey到发票的单个模型。
所以,我无法理解这种行为。这是错误还是功能?
答案 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')
返回正确的值。