Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查询Django中所有类型的每个唯一类型的第n个最新条目_Python_Django - Fatal编程技术网

Python 查询Django中所有类型的每个唯一类型的第n个最新条目

Python 查询Django中所有类型的每个唯一类型的第n个最新条目,python,django,Python,Django,我研究过这个问题,答案是关于每种类型的最新答案,例如 不同之处在于,我希望获得所有类型的每种类型的n最新项目。现在我得到了所有的条目,然后在python中找到第n个最近的条目,这非常慢 e、 g 类CakeType(models.Model): name=models.CharField(最大长度=40) 类别CakeEntry(models.Model): cake_type=models.ForeignKey(CakeType,on_delete=models.CASCADE) create

我研究过这个问题,答案是关于每种类型的最新答案,例如

不同之处在于,我希望获得所有类型的每种类型的
n
最新项目。现在我得到了所有的条目,然后在python中找到第n个最近的条目,这非常慢

e、 g

类CakeType(models.Model):
name=models.CharField(最大长度=40)
类别CakeEntry(models.Model):
cake_type=models.ForeignKey(CakeType,on_delete=models.CASCADE)
created=models.DateTimeField()
对于所有不同/独特的
CakeType
,我们如何才能说出最近的5个
CakeEntry

我将数据库从MySQL迁移到PostgreSQL(做了很多工作),所以我可以在上使用Postgres的
DISTINCT

阅读文档后,我尝试了以下操作:

从django.db.models导入F,窗口
从django.db.models.functions导入秩
蛋糕(u)项目=(
CakeEntry.objects.order\u by(
“-创建”
).注释(
排名=窗口(
表达式=秩(),
partition_by=[F('cake_type_id')],
order_by=F('created').desc(),
),
).filter(秩\u lt=5)
)

但是get
django.db.utils.NotSupportedError:Window在filter子句中是不允许的。
如果没有秩/分区,我不知道该怎么做。

我看不到使用Window的方法,因为目标冲突:

为了避开过滤器问题,必须创建一个子查询。问题是,用作表达式(注释)的子查询应该返回1行,以便将特定的列组绑定到特定的外部引用,但窗口需要所有相关行的范围。如图所示:

Pk 21排名第三 CakeEntry.objects.all().注释(rank=rank).值(“rank”,“pk”)[:3] 出[11]: #由于过滤器的原因,pk 21的排名为1,即使您似乎在注释之后进行过滤 CakeEntry.objects.all().annotate(rank=rank).values(“rank”,“pk”).filter(pk=21) 出[12]:
我能想到的最接近的方法是:

类CakeEntryManager(models.Manager): def top5每种类型(自身): cake_types=CakeType.objects.all() qs=self.get_queryset() 结果=qs.none() 对于蛋糕类型的ct: results=results.union(qs.filter(cake_type=ct).order_by(“-created”)[:5]) 返回结果。订购人(“蛋糕类型”,“已创建”)
谢谢你给了我这么好的机会。这看起来确实是一个相当合理的方法。另一种方法是执行窗口查询,只获取id,清理id,然后将id列表传递到另一个查询中,以获取完整参数并执行联接。我可能会介绍,但方法。再次感谢!