【问题标题】:How can I find the newest match for all names in a Django model?如何找到 Django 模型中所有名称的最新匹配项?
【发布时间】:2012-02-24 22:24:01
【问题描述】:

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

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

    unique_together = ('name', 'version')

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

Django 模型可以做到这一点吗?如果是这样,那会是什么样子?

【问题讨论】:

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


    【解决方案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')
    

    【讨论】:

      【解决方案2】:

      我不确定您是否可以仅使用 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'))
      

      【讨论】:

      • 我的用例会是什么样子?你能告诉我如何 A) 列出所有模型的最新版本,B) 获取任何版本的特定模型,以及 C) 这个“注释”事情将在哪里完成?
      猜你喜欢
      • 2012-04-09
      • 2017-11-02
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多