我搜索了一下,却找不到做以下事情的方法:
假设我们有一个包含"field_a“和"field_b”字段的Django模型。我希望以某种方式限制结果,即对于"field_a“的每个不同值,从模型表中检索最多N个条目。因此,这不是对查询集进行切片的情况,因为这不会区分"field_a“值。
PS:有一种使用SQL的方法。
让我们举一个例子:
class ExampleModel(models.Model):
foreign = models.ForeignKey(ForeignTable)
user = models.ForeignKey(User, related_name="user_attending")
基本上,我想做以下几点:
查找所有具有特定id的ExampleModels
,用于foreign_id
和user_id
。但是我只想从一个user_id
的列表中找出最多3个user_id
的,所以即使有20个匹配的user_id
为某个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
发布于 2014-07-28 11:11:47
试着使用切片示例:
ExampleModel.objects.filter(ForeignTable__id=1).order_by('id')[:3]
返回前3个对象(限制为3)
发布于 2014-07-28 11:03:46
如果您知道如何在SQL中执行此操作,那么我建议您将该约束作为一个额外的选项添加到django queryset中,如这个问题接受的答案中所示。
也见Queryset额外文档。
发布于 2014-07-28 12:46:45
好吧,您可以这样做,对于下面的模型:
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_by
和distinct
一起会导致问题,因此我附加了另一个字段。参考这里。
通常,切片QuerySet返回一个新的QuerySet -它不计算查询。参考这里
编辑:我不认为请求的进程可以通过一个查询来完成。
data= [ ExampleModel.objects.filter(foreign_id=f)[0:2] for f in ForeignTable.objects.all()]
https://stackoverflow.com/questions/25001615
复制相似问题