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
如果每个项目都有版本,那么是否可以获得最新版本的查询集?对不起,我真的不知道如何编写查询集。
很抱歉我发布了错误的模型,项目字段本应在发布模型上,只是一个复制粘贴问题。
有一种方法可以在单个查询中实现这一点,您需要将annotate
和filter
组合在一起。
方法是用与发布相关的每个项目的最高版本来注释每个对象。所以我们通过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