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)
)
但是getdjango.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列表传递到另一个查询中,以获取完整参数并执行联接。我可能会介绍,但方法。再次感谢!