I have a model that is something like this:
class Input(models.Model):
details = models.CharField(max_length=1000)
user = models.ForeignKey(User)
class Case(Input):
title = models.CharField(max_length=200)
views = models.IntegerField()
class Argument(Input):
case = models.ForeignKey(Case)
side = models.BooleanField()
A user can submit many arguments, per case. I want to be able to say how many users have submitted side=true
arguments.
I mean if 1 user had 10 arguments and another user had 2 arguments (both side=true
)
I'd want the count to be 2, not 12.
I am using these methods on the Case object:
def users_agree(self):
return self.argument_set.filter(side=True).values('user').distinct()
def users_disagree(self):
return self.argument_set.filter(side=False).values('user').distinct()
My template code calls count()
on them.
Can you try:
Argument.objects.filter(side=True).values('case__user').distinct().count()
I think it does what you want. It issues one SQL query:
SELECT COUNT(DISTINCT "example_input"."user_id") FROM "example_argument" INNER JOIN "example_case" ON ("example_argument"."case_id" = "example_case"."input_ptr_id") INNER JOIN "example_input" ON ("example_case"."input_ptr_id" = "example_input"."id") WHERE "example_argument"."side" = True
Edit:
For this_case
, get all users whose argument.side is True:
Argument.objects.filter(case__id=this_case.id, side=True).values('user').distinct()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With