【问题标题】:Django select max idDjango选择最大ID
【发布时间】:2011-02-22 11:50:04
【问题描述】:

给定一个带有自动设置“id”的标准模型(称为图像),我如何获得最大 id?

到目前为止我已经尝试过:

max_id = Image.objects.all().aggregate(Max('id'))

但我收到“id__max”键错误。

尝试

max_id = Image.objects.order_by('id')[0].id

给出“map() 的参数 2 必须支持迭代”异常

有什么帮助吗?

【问题讨论】:

  • 为什么要最大id?你想加载最后的东西吗?日期最大的东西? ID 是随机数,它们意义不大,也不能保证 max(id) 有任何有用的属性。你真正想做什么?

标签: python django


【解决方案1】:

只需按反向id排序,然后取前一个。

Image.objects.all().order_by("-id")[0]

【讨论】:

  • 这不是要评估查询集并执行对象构造吗? Image.objects.values('id').aggregate(min_id=Min('id')) 会生成一个包含 min_id 的单键字典。也许这在 10 年前是不可能的。
【解决方案2】:

在当前版本的 django (1.4) 中,它更具可读性

Image.objects.latest('id').id

【讨论】:

  • 如果没有对象会抛出 Image.DoesNotExist 异常
  • 是的,在这种情况下,之前的答案会引发 IndexError。
  • 它适用于任何领域。看源头。它只是QuerySet.order_by('-%s' % field)[:1].get() 的语法糖。
  • 只有在至少有一个对象时才有效,try catch 将与此一起使用。
  • 为了节省其他人的时间,你会这样做:from django.db import models max_id = None try: max_id = Image.objects.latest('id').id except models.DoesNotExist: pass
【解决方案3】:

你的逻辑是对的,这将返回最大 id

res = Image.objects.filter().aggregate(max_id=Max('pk'))
res.get('max_id')

【讨论】:

  • filter() 是多余的,只是 res = Image.objects.aggregate(max_id=Max('pk'))
【解决方案4】:

我知道这已经有了正确的答案,但这是另一种方法:

prev = Image.objects.last()

这给了你最后一个对象。

【讨论】:

    【解决方案5】:

    没有捕获异常并使用 django orm 的最新对象:

    Image.objects.filter().order_by('id').first()

    【讨论】:

    • First 会返回最小的 id,不是吗?你不应该使用 last() 吗?或带有 id 的 '-' 以降序排列?
    【解决方案6】:

    这也很好用:

    max_id = Image.objects.values('id').order_by('-id').first()
    

    【讨论】:

      【解决方案7】:

      这对我有用

      [模型].objects.last().id

      Image.objects.last().id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-22
        • 2013-05-31
        • 1970-01-01
        • 2023-02-06
        • 2021-07-21
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        相关资源
        最近更新 更多