在Django中对QuerySet进行分组

时间:2017-03-17 11:42:47

标签: python django django-queryset

有这样的计划:

class Model1(models.Model):
    pass


class Model2(models.Model):
    model1 = models.ForeignKey(Model1)
    date = models.DateField()


class Model3(models.Model):
    model2 = models.ForeignKey(Model2)

我需要查询具有唯一Model3和最少model2__model1__id的{​​{1}}。 我已设法使用model2__date方法进行必要的查询,如下所示:

QuerySet.extra()

但我担心它不会使用额外的排序等工作。 我也不想使用原始查询,因为那些也不支持排序,还有数据库级别的切片(可能有大量的记录)。

有没有更正确的方法去做我想要实现的目标?

UP: 我正在使用MySQL DB后端,因此Model3.objects.order_by('model2__date').extra(select={'m1_id': 'DISTINCT `app_model2`.`model1_id`'}) 字段名称不可用

2 个答案:

答案 0 :(得分:1)

我知道你可以做以下事情

Model3.objects.order_by('model2__model1_id', 'model2__date').distinct('model2__model1_id')

不幸的是,它没有按model2.date排序,但对于每个model1.idmodel2.date最少,而且按照model1 id排序

答案 1 :(得分:0)

我找到了解决方案:模块django-group-by允许将分组应用于查询集,如下所示:

Model3.objects.group_by('model2__model1')

(您需要将GroupByMixin混合到模型管理器中)