Мне нужно сгруппировать все записи по пользователю и получить счет, выполнив что-то вроде этого:
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 без необработанных данных?
Кажется, есть билет, который позволит мне делать то, что я хочу в будущем, на багтрекере, включив DISTINCT ON
: https://code.djangoproject.com/ticket/6422