Python 同时使用两个注释表达式时出现错误结果

Python 同时使用两个注释表达式时出现错误结果,python,django,python-3.x,django-models,orm,Python,Django,Python 3.x,Django Models,Orm,假设下表: class Table1(models.Model): Column1 = models.IntegerField() class Table2(models.Model): Column2 = models.IntegerField() class Table3(models.Model): Table1 = models.ForeignKey(Table1, null=False, on_delete=models.CASCADE) Ta

假设下表:

class Table1(models.Model): 
    Column1 = models.IntegerField()
class Table2(models.Model):  
    Column2 = models.IntegerField()
class Table3(models.Model):  
    Table1 = models.ForeignKey(Table1, null=False, on_delete=models.CASCADE)
    Table2 = models.ForeignKey(Table2, null=False, on_delete=models.CASCADE)
    Column3 = models.IntegerField()
class Table4(models.Model):  
    Table1 = models.ForeignKey(Table1, null=False, on_delete=models.CASCADE)
    Table3 = models.ForeignKey(Table3, null=False, on_delete=models.CASCADE)
    Column4 = models.IntegerField()
此注释表达式返回正确答案:

print(Table1.objects.annotate(Exp1=Sum(
            Case(
                When(table3__Table2__Column2__in=[2, 3],
                     then=F('table3__Column3')),
                default=Value(0)
            ),
    )).values('Exp1'))
即:

<QuerySet [{'Exp1': 96}]>
同样,结果是正确的:

<QuerySet [{'Exp2': 0}]>
但不幸的是,结果并不正确:

<QuerySet [{'Exp2': 0, 'Exp1': 480}]>

使用带有
注释的多个聚合时有一个警告:

将多个聚合与
annotate()
组合将产生错误的结果 结果,因为使用了联接而不是子查询。 对于大多数骨料,无法避免此问题

与使用
Count
进行聚合不同,
Sum
不采用有助于消除重复项的
distinct
参数。我想如果你想得到正确的结果,你应该保留不同的查询

请参阅。

报告了该错误,但即使在Django 1.11中也没有解决。这个问题与以相反关系连接两个表有关。 请注意,distinct参数适用于Count,但不适用于Sum。因此,我使用了一个技巧,并编写了以下运行良好的ORM:

print(Table1.objects.annotate(
    temp_Exp1=Sum(
            Case(
                When(table3__Table2__Column2__in=[2, 3],
                     then=F('table3__Column3')),
                default=Value(0)
            ),), 
    temp_Exp2=Sum(
            Case(
                When(table4__Table3__Table2__Column2=3,
                     then=F('table4__Column4')),
                default=Value(0)
            ),),
    table3_count=Count('table3'),
    table3_count_distinct=Count('table3', distinct=True),
    table4_count=Count('table4'),
    table4_count_distinct=Count('table4', distinct=True),
).annotate(
    Exp1=F('temp_Exp1')*F('table3_count_distinct')/F('table3_count'),
    Exp2=F('temp_Exp2')*F('table4_count_distinct')/F('table4_count'),
).values('Exp1', 'Exp2'))

在结束每个和括号之前,我添加了distinct=True。但是结果还是一样的。@Ahmad我从来没有说过添加一个
distinct=True
Sum
有效。是的,亲爱的@MosesKoledoye。它似乎只适用于Count。现在,当
distinct=True
对它不起作用时,我能为
Sum
做些什么?
<QuerySet [{'Exp2': 0, 'Exp1': 480}]>
print(Table1.objects.annotate(
    temp_Exp1=Sum(
            Case(
                When(table3__Table2__Column2__in=[2, 3],
                     then=F('table3__Column3')),
                default=Value(0)
            ),), 
    temp_Exp2=Sum(
            Case(
                When(table4__Table3__Table2__Column2=3,
                     then=F('table4__Column4')),
                default=Value(0)
            ),),
    table3_count=Count('table3'),
    table3_count_distinct=Count('table3', distinct=True),
    table4_count=Count('table4'),
    table4_count_distinct=Count('table4', distinct=True),
).annotate(
    Exp1=F('temp_Exp1')*F('table3_count_distinct')/F('table3_count'),
    Exp2=F('temp_Exp2')*F('table4_count_distinct')/F('table4_count'),
).values('Exp1', 'Exp2'))