I have the following models:
class GamificationContext(models.Model):
# ... fields
def get_users_with_annotated_reputation_total(self):
return User.objects.all().annotate(
reputation_total=Sum("reputation_deltas__delta", default=0) # <-- problem here
)
class GamificationReputationDelta(TimestampableModel):
context = models.ForeignKey(
GamificationContext,
related_name="reputation_deltas",
on_delete=models.CASCADE,
)
user = models.ForeignKey(
User,
related_name="reputation_deltas",
on_delete=models.CASCADE,
)
delta = models.IntegerField()
My issue is that the method get_users_with_annotated_reputation_total
sums over all the reputation_deltas
of users for all GamificationContext
s, whereas I’d like to only get those that reference the object I’m calling the method on.
I have taken a look at the API of Aggregate
and I couldn’t find an easy way to apply a restriction on the related objects I’m aggregating over. How do I achieve what I’m trying to accomplish here?