Django: Queryset replacement for group by aggregate?



我的表结构:

id | file_id(foreign key) | version_id(foreign key) | function_id(foreign key)

id与(file_id, version_id, function_id)唯一

我正在寻找可以模拟以下sql查询的Django查询集:

select *, max(version_id) from change_metrics group by function_id order by version_id

基本上,我需要获得所有唯一文件-函数组合的最新版本,因为特定文件-函数组合可能存在许多版本。我目前正在使用原始sql查询,我想用查询集代替它们。

我不能改变数据库结构,但我愿意接受各种sql查询或解决这个问题的方法

假设您的模型如下所示:

class Function(models.Model):
    pass
class File(models.Model):
    pass
class Version(models.Model):
    pass
class ChangeMetric(models.Model):
    function = models.ForeignKey(Function)
    file = models.ForeignKey(File)
    version = models.ForeignKey(Version)

你应该能够做到以下几点:

from django.db.models import Max
Function.objects.all().annotate(max_version=Max('changemetric_set__version___id'))

您可以使用:

from django.db.modelsq = change_metrics.objects.annotate(Max('version_id')).order_by('version_id')

最新更新