abe*_*bey 5 python django django-annotate
我遇到了一个问题,即向查询集添加注释会更改以前注释的结果。
这是(简化的)设置:
class Player(models.Model):
name = models.CharField()
class Unit(models.Model):
player = models.ForeignKey(Player, on_delete=models.CASCADE,
related_name='unit_set')
rarity = models.IntegerField()
class Gear(models.Model):
pass
class UnitGear(models.Model):
unit = models.ForeignKey(Unit, on_delete=models.CASCADE,
related_name='ug_set')
gear = models.ForeignKey(Gear, on_delete=models.PROTECT)
Run Code Online (Sandbox Code Playgroud)
用稀有度 7 单位的数量来注释玩家效果很好:
Player.objects.annotate(
rarity7_count=Count(unit_set__rarity=7)
).values_list('name', 'rarity7_count')
[('Player1', 170),
('Player2', 172),
('Player3', 164),
...,
)]
Run Code Online (Sandbox Code Playgroud)
上面返回的值rarity7_count是正确的。
如果我添加以下附加注释,情况就不再是这样:
Player.objects.annotate(
rarity7_count=Count(unit_set__rarity=7),
gear_count=Count(unit_set__ug_set)
).values_list('name', 'rarity7_count', 'gear_count')
[('Player1', 476, 456),
('Player2', 490, 466),
('Player3', 422, 433),
...,
)]
Run Code Online (Sandbox Code Playgroud)
请注意值是如何rarity7_count变化的——这些值不再正确!gear_count然而,的值是正确的。
这是为什么?如何让两个注释同时工作而不互相干扰?我已经尝试过各种各样的事情,但目前不知道如何做到这一点。
是的,因为现在有两个JOINs,并且由于Count(..)[Django-doc]是行数,因此它将充当某种乘数。
然而,我们可以通过指定 来解决这个问题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')Run Code Online (Sandbox Code Playgroud)
请注意,如果您gear_count还希望过滤稀有度,则需要filter=再次指定该部分。
| 归档时间: |
|
| 查看次数: |
1020 次 |
| 最近记录: |