【发布时间】:2019-10-26 07:46:12
【问题描述】:
我遇到了一个问题,向 QuerySet 添加注释会更改以前注释的结果。
这是(简化的)设置:
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)
用稀有 7 个单位来注释玩家效果很好:
Player.objects.annotate(
rarity7_count=Count(unit_set__rarity=7)
).values_list('name', 'rarity7_count')
[('Player1', 170),
('Player2', 172),
('Player3', 164),
...,
)]
上面为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),
...,
)]
注意rarity7_count 值的变化——这些值不再正确!但是,gear_count 的值是正确的。
这是为什么呢?如何在不相互干扰的情况下让两个注释都工作?我已经尝试了各种方法,但目前不知道如何做到这一点。
【问题讨论】:
-
是的,既然你做了两个
JOINs,这将充当某种“乘数”。 -
@WillemVanOnsem:我可以找到一些关于此的文档(在 Django 级别)吗?如何使用单个 QuerySet 实现我打算在这里做的事情?
标签: python django django-annotate