如何在Django模型中找到所有名称的最新匹配?

时间:2012-02-02 08:49:12

标签: python django orm django-models django-queryset

我有一个看起来像这样的django模型:

class MyModel(Model):
    name = CharField(...)
    version = IntegerField(...)
    other_stuff = ...

    unique_together = ('name', 'version')

我希望能够查询每个名称的所有最新版本,但省略任何给定名称的所有旧版本。

Django型号可以实现吗?如果是这样,那会是什么样的?

2 个答案:

答案 0 :(得分:4)

我不确定你是否可以立即使用Django ORM的聚合功能。无论如何,我认为这个结构正在尖叫这样的模型:

class MyModel(Model):
    name = CharField(...)
    some_stuff = ...

class Version(Model):
    number = IntegerField(...)
    my_model = ForeignKey(MyModel, ...)
    other_stuff = ...

所以你可以这样做以获得每个MyModel的最新版本:

>>> from django.db.models import Max
>>> MyModel.objects.annotate(highest_version = Max('version__number'))

答案 1 :(得分:1)

我相信你需要按名称分组,然后选择每个组。从来没有使用过这个,但this question可能会提供一些有关如何操作的见解。

更新:似乎我的代码是正确的,但它应该适用于您的具体情况我还不知道如何在同一个查询中获取其他字段(假设您不想只有版本号,但其他东西也是 - 这个解决方案不起作用):

from django.db.models import Max
MyModel.objects.values('name').annotate(Max('version'))

# Will return something like:
# [{'name':'a', 'version__max':3}, {'name':'b', 'version__max':2}, ...]

如果您使用的是Django 1.4和PostgreSQL,可能可以使用distinct方法执行此操作:

MyModel.objects.order_by('name', '-version').distinct('name')