Django "group by" с помощью аннотаций: Получить объект из .value () против идентификатора - PullRequest
5 голосов
/ 23 апреля 2011

Я пытаюсь сделать эквивалент «group by», чтобы получить список всех догадок в опросах владельца викторины, сгруппированных по пользователю и помеченных подсчетом того, сколько предположений сделал этот пользователь.

Соответствующие модели:

class Quiz(models.Model):  
    user = models.ForeignKey(User)
    ...

class Guess(models.Model):  
    user = models.ForeignKey(User)
    quiz = models.ForegnKey(Quiz)
    ...

Этот запрос:

guessors = Guess.objects.filter(quiz__user=request.user).values('user').annotate(cnt=Count('user')).order_by('cnt')

Возвращает что-то вроде этого, что очень близко к тому, что мне нужно:

{'cnt': 5, 'user': 5}
{'cnt': 3, 'user': 4}
{'cnt': 2, 'user': 3}
{'cnt': 1, 'user': 2}

Обратите внимание, однако, что «пользователь» возвращается как int, когда то, что я хочу, является полным объектом User. Какие-нибудь предложения относительно того, как мне наиболее эффективно получить полный объект User?

Ответы [ 2 ]

4 голосов
/ 23 мая 2011

За короткое, но напряженное время, проведенное с Django, я обнаружил, что функция group_by - одна из функций SQL, по которой я скучаю больше всего. Я пробовал метод агрегации values ​​(), который вы использовали выше, но у меня возникла та же проблема, когда я хотел вернуть объект. В итоге я использовал raw SQL , который не был красивым, но работал для того, что мне было нужно.

1 голос
/ 23 апреля 2011

Один из вариантов - попытаться получить все пользовательские поля, используя двойное подчеркивание, например, вы можете сделать что-то вроде значений ('user_ username', 'user _someOtherField'). Я не уверен в получении всего пользовательского объекта, возможно, кто-то еще может помочь с этим.

...