Django QuerySet:限制某些字段的结果分组

时间:2014-07-28 18:14:50

标签: python django django-queryset

我搜索过,无法找到办法执行以下操作:

假设我们有一个Django模型,其字段为“field_a”和“field_b”。 我想以某种方式限制结果,对于每个不同的“field_a”值,从模型表中检索最多N个条目。因此,这不是切片查询集的情况,因为这不会区分“field_a”值。

PS:有一种方法可以使用SQL。

让我们举个例子:

class ExampleModel(models.Model):
    foreign = models.ForeignKey(ForeignTable)
    user = models.ForeignKey(User, related_name="user_attending")

基本上我想做以下事情:

查找ExampleModelsforeign_id具有特定ID的所有user_id。但我只想从user_id列表中找到最多3 user_id个。因此,即使某个user_id有20个匹配foreign_id,也请给我前三名。

我很感激帮助!

编辑: 似乎我的问题被误解了,所以我将提供一个例子。从:

foreign_id=1,user_id=1
foreign_id=1,user_id=2
foreign_id=1,user_id=3
foreign_id=1,user_id=4
foreign_id=2,user_id=5
foreign_id=2,user_id=6
foreign_id=2,user_id=3
foreign_id=2,user_id=2
foreign_id=3,user_id=1
foreign_id=3,user_id=9

结果将是,只有一个查询集:

foreign_id=1,user_id=1
foreign_id=1,user_id=2
foreign_id=1,user_id=3
foreign_id=2,user_id=5
foreign_id=2,user_id=6
foreign_id=2,user_id=3
foreign_id=3,user_id=1
foreign_id=3,user_id=9

3 个答案:

答案 0 :(得分:1)

尝试使用切片 为例:

ExampleModel.objects.filter(ForeignTable__id=1).order_by('id')[:3]

返回前3个对象(限制3)

答案 1 :(得分:0)

如果您知道如何在SQL中执行此操作,那么我建议您将该约束添加为django查询集的额外选项,例如在this question

的已接受答案中

另请参阅Queryset extra documentation

答案 2 :(得分:0)

嗯,您可以尝试这样,对于以下型号:

class ExampleModel(models.Model):
    foreign = models.ForeignKey(ForeignTable)
    user = models.ForeignKey(User, related_name="user_attending")
    time_created= models.DateTimeField(auto_now_add=True)


results= ExampleModel.objects.filter(foreign__id=1).annotate(time_created_max=Max('time_created')).order_by('time_created_max').distinct()

three_results= results[:3] 

PS: order_bydistinct会导致问题,因此我附加了另一个字段。参考here

通常,切片QuerySet会返回一个新的QuerySet - 它不会评估查询。参考here

编辑:我认为单个查询无法完成请求的过程。

data= [ ExampleModel.objects.filter(foreign_id=f)[0:2] for f in ForeignTable.objects.all()]