我搜索过,无法找到办法执行以下操作:
假设我们有一个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")
基本上我想做以下事情:
查找ExampleModels
和foreign_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
答案 0 :(得分:1)
尝试使用切片 为例:
ExampleModel.objects.filter(ForeignTable__id=1).order_by('id')[:3]
返回前3个对象(限制3)
答案 1 :(得分:0)
如果您知道如何在SQL中执行此操作,那么我建议您将该约束添加为django查询集的额外选项,例如在this question
的已接受答案中答案 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_by
和distinct
会导致问题,因此我附加了另一个字段。参考here。
通常,切片QuerySet会返回一个新的QuerySet - 它不会评估查询。参考here
编辑:我认为单个查询无法完成请求的过程。
data= [ ExampleModel.objects.filter(foreign_id=f)[0:2] for f in ForeignTable.objects.all()]