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'))