我有一个类似的模型:
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()
用户可以根据具体情况提交许多参数。我希望能够说明有多少用户提交了side=true
个参数。
我的意思是如果1个用户有10个参数而另一个用户有2个参数(两个side=true
)
我希望计数为2,而不是12。
我在Case对象上使用这些方法:
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()
我的模板代码会调用count()
。
答案 0 :(得分:9)
你可以尝试:
Argument.objects.filter(side=True).values('case__user').distinct().count()
我认为它能满足您的需求。它发出一个SQL查询:
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
编辑:
对于this_case
,请获取其argument.side为True的所有用户:
Argument.objects.filter(case__id=this_case.id, side=True).values('user').distinct()