django获取最新版本的QuerySet


class Release(models.Model):
version = models.PositiveIntegerField(default=1)
project = models.ForeignKey('projects.Project', related_name='releases', on_delete=models.SET_NULL, blank=1, null=1)

class Project(models.Model):
# pass

def getObjects():
releases = []
for project in Project.objects.all():
if project.releases.all():
releases.append(project.releases.all().order_by('-version')[0])
return releases

如果每个项目都有版本,那么是否可以获得最新版本的查询集?对不起,我真的不知道如何编写查询集。


很抱歉我发布了错误的模型,项目字段本应在发布模型上,只是一个复制粘贴问题。

有一种方法可以在单个查询中实现这一点,您需要将annotatefilter组合在一起。

方法是用与发布相关的每个项目的最高版本来注释每个对象。所以我们通过project__releases__version的关系使用了一个双下划线。这将获取与每个版本相关的项目,获取该项目的所有相关版本,从而获取所有版本。

我们可以将Max应用于该字段以获得最高值。一旦我们知道最新版本是什么,我们就可以简单地使用F()对象来过滤该值的查询集,该对象获取字段值。

from django.db.models import Max, F
Release.objects.annotate(
latest_for_project=Max(project__releases__version)
).filter(
latest_for_project=F('release')
)

您必须正确设置关系。如果要与Release建立关系,则不应将Project连接到Project:(使用直接关系或模型的方法要好得多。然后你可以更容易地在外面的任何地方使用它。

class Release(models.Model):
version = models.PositiveIntegerField(default=1)
project = models.ForeignKey('projects.Project', related_name='releases', on_delete=models.SET_NULL, blank=1, null=1)

class Project(models.Model):
# project fields
def latest_release(self):
return self.releases.order_by('-version').first()

然后在功能(或外壳(中:

def get_latest_releases():
releases = []
for project in Project.objects.all():
if project.latest_release():
releases.append(project.latest_release())
return releases

相关内容

  • 没有找到相关文章

最新更新