查找Django中字段唯一的对象计数

时间:2009-05-10 17:29:59

标签: django

我有一个类似的模型:

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()

1 个答案:

答案 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()