Как я могу заставить GROUP BY работать в Django ORM, где мне нужны все поля и объект - PullRequest
0 голосов
/ 07 декабря 2011

Мне нужно сгруппировать все записи по пользователю и заставить счет делать что-то вроде этого:

class Promotion(models.Model):
    pass

class Entry(models.Model):
    user = models.ForeignKey('User');
    promotion = models.ForeignKey('Promotion')


def get_uniques(promotion_id):
    promotion = Promotion.objects.get(promotion_id)
    entries = promotion.entry_set.annotate(Count('user'))
    return entries

Однако он возвращает одного и того же пользователя несколько раз.Я также попробовал следующее после просмотра StackOverflow, и он, кажется, делает что-то отличное от того, что я хочу:

promotion.entry_set.annotate(Count('user')).order_by('user')[:10]
promotion.entry_set.all().values('user').annotate(entry_count=Count('user')).order_by()
Entry.objects.filter(promotion=promotion).annotate(Count('user')).order_by('user')

В основном я пытаюсь сделать это, давая мне объект Entry для каждогопользователь:

Entry.objects.raw("""
    SELECT *
    FROM promotion_entry
    WHERE promotion_id = %s
    GROUP BY user_id""", (promotion_id,))

Затем я выполню второй запрос, чтобы получить количество записей, все еще не идеальное.Могу ли я сделать GROUP BY без raw?

Кажется, есть билет, который позволил бы мне делать то, что я хочу в будущем, на багтрекере, включив DISTINCT ON: https://code.djangoproject.com/ticket/6422

1 Ответ

0 голосов
/ 07 декабря 2011

Если вы хотите считать записи для каждого пользователя, используйте:

promotion.entry_set.all().values('user').annotate(entry_count=Count('id')).order_by()

Если вы хотите, чтобы какая-то запись для каждого пользователя использовалась:

promotion.entry_set.all().values('user').annotate(entry_id=Max('id')).order_by()

Это даст вам id записей, используйте __in для получения самих объектов.

...