Нахождение количества объектов, где поле уникально в Джанго - PullRequest
4 голосов
/ 10 мая 2009

У меня есть модель, похожая на эту:

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 Ответ

9 голосов
/ 10 мая 2009

Можете ли вы попробовать:

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

Edit:

Для this_case получить всех пользователей, для аргумента которого значение аргумента.

Argument.objects.filter(case__id=this_case.id, side=True).values('user').distinct()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...