如何让GROUP BY在需要所有字段和对象的Django ORM中工作

时间:2011-12-07 10:44:26

标签: django django-orm

我需要按用户对所有条目进行分组,并按照以下方式进行计数:

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 {{1}} {{1}},似乎有一张票可以让我在将来对错误跟踪器做我想做的事情:https://code.djangoproject.com/ticket/6422

1 个答案:

答案 0 :(得分:0)

如果您想为每个用户计算条目:

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自行获取对象。