我想将来自用户的相关值的总和与没有这些值的用户连接起来。
这是我的模型结构的简化版本:
class Answer(models.Model):
person = models.ForeignKey(Person)
points = models.PositiveIntegerField(default=100)
correct = models.BooleanField(default=False)
class Person(models.Model):
# irrelevant model fields
样本数据集:
Person | Answer.Points
------ | ------
3 | 50
3 | 100
2 | 100
2 | 90
Person 4 has no answers and therefore, points
通过下面的查询,我可以实现每个人的积分总和:
people_with_points = Person.objects.\
filter(answer__correct=True).\
annotate(points=Sum('answer__points')).\
values('pk', 'points')
<QuerySet [{'pk': 2, 'points': 190}, {'pk': 3, 'points': 150}]>
但是,由于有些人可能没有任何相关Answer
条目,他们将获得 0 分,并且我使用下面的查询Coalesce
来“伪造”他们的积分,如下所示:
people_without_points = Person.objects.\
exclude(pk__in=people_with_points.values_list('pk')).\
annotate(points=Coalesce(Sum('answer__points'), 0)).\
values('pk', 'points')
<QuerySet [{'pk': 4, 'points': 0}]>
这两个都按预期工作,但我想让它们在同一个查询集中,所以我使用联合运算符|
加入它们:
everyone = people_with_points | people_without_points
现在,对于问题:
在此之后,没有积分的人的points
价值变成了None
而不是0。
<QuerySet [{'pk': 2, 'points': 190}, {'pk': 3, 'points': 150}, {'pk': 4, 'points': None}]>
任何人都知道为什么会发生这种情况?
谢谢!