Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django注释对另一个注释有副作用_Python_Django_Django Annotate - Fatal编程技术网

Python Django注释对另一个注释有副作用

Python Django注释对另一个注释有副作用,python,django,django-annotate,Python,Django,Django Annotate,我遇到了一个问题,在QuerySet中添加注释会更改以前注释的结果 以下是(简化的)设置: class播放器(models.Model): name=models.CharField() 类别单位(型号.型号): player=models.ForeignKey(player,on_delete=models.CASCADE, 相关的_name='unit\u set') 稀有性=models.IntegerField() 齿轮类(型号.型号): 通过 等级UnitGear(型号.型号): un

我遇到了一个问题,在QuerySet中添加注释会更改以前注释的结果

以下是(简化的)设置:

class播放器(models.Model):
name=models.CharField()
类别单位(型号.型号):
player=models.ForeignKey(player,on_delete=models.CASCADE,
相关的_name='unit\u set')
稀有性=models.IntegerField()
齿轮类(型号.型号):
通过
等级UnitGear(型号.型号):
unit=models.ForeignKey(unit,on_delete=models.CASCADE,
相关的_name='ug_set')
齿轮=型号。外键(齿轮,on_delete=型号。保护)
用稀有7个单位的计数来注释玩家效果很好:

Player.objects.annotate(
稀有度7\u计数=计数(单位集\u稀有度=7)
).values\u list('name','rarity7\u count')
[('Player1',170),
('Player2',172),
('Player3',164),
...,
)]
上述
rarity7_count
返回的值是正确的

如果我添加以下附加注释,则情况不再如此:

Player.objects.annotate(
稀有度7_计数=计数(单位集稀有度=7),
档位计数=计数(单位整定整定)
).值列表('name'、'rarity7'u count'、'gear'u count')
[('Player1',476456),
('Player2',490466),
('Player3',422433),
...,
)]
注意
rarity7\u count
值是如何变化的——这些值不再正确!但是,档位计数的值是正确的


为什么呢?如何使两个注释都工作而不相互干扰?我已经尝试了各种各样的方法,但目前还不知道如何做到这一点。

是的,因为现在有两个
JOIN
s,并且由于是行数,因此它将充当某种乘数

但是,我们可以通过指定
distinct=True
来解决此问题,如:

Player.objects.annotate(
    rarity7_count=Count('unit_set', distinct=True, filter=Q(unit_set__rarity=7)),
    gear_count=Count('unit_set__ug_set')
).values_list('name', 'rarity7_count', 'gear_count')
Player.objects.annotate(
稀有度7_count=count('unit_set',distinct=True,filter=Q(unit_set_稀有度=7)),
档位计数=计数('unit\u set\uu ug\u set')
).值列表('name'、'rarity7'u count'、'gear'u count')

请注意,如果您想让
gear\u count
也对稀有性进行过滤,您需要再次指定
filter=
部分。

是的,因为您将两个
JOIN
s,这将起到某种“乘数”的作用。@WillemVanOnsem:我能找到一些关于这方面的文档(在Django级别)吗?我如何通过一个查询集实现我在这里的目标?非常感谢——这很有效。我有一个后续问题:我现在尝试在这个注释中添加一个
Sum
r7\u Sum=Sum('unit\u set\u rarity',filter=Q(unit\u set\u rarity=7))
(现实不那么琐碎,但我正在适应上面的模型)。使用
Sum
我得到的结果太大(我假设与上面的问题相同),而使用
DistinctSum
则结果太低。我错过了什么?我应该写一个新问题吗?@abey:
过滤器
ing可能与此相关,因为对于过滤器,您经常会添加额外的约束,即某些内容不可为空,因此我建议您制定一个可以重现错误的MWE。完成,这里是