ユーザーからの関連する値の合計を、それらの値を持たないユーザーと結合したいと考えています。
これが私のモデル構造の簡略化されたバージョンです:
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
さて、問題について:
この後、ポイントのない人は、値が0 ではなく にpoints
変わります。None
<QuerySet [{'pk': 2, 'points': 190}, {'pk': 3, 'points': 150}, {'pk': 4, 'points': None}]>
なぜこれが起こるのか誰にも分かりますか?
ありがとう!