【问题标题】:Last value of a column QuerySet API (Django)列 QuerySet API (Django) 的最后一个值
【发布时间】:2014-05-07 15:37:03
【问题描述】:

我想获取一列的最后一个值。我怎么才能得到它? SELECT column_name FROM table_name ORDER BY id DESC LIMIT 1 的 Django 查询集的翻译。这在 MySQL 中运行良好,但我在 Django 中找不到等效的。建议?解决方案?

以前,它是一个查询集,它生成了一个这样的查询集:SELECT MAX(column_name) FROM table_name WHERE column_name_2 = x,但花了很长时间,我想改变。

谢谢!

【问题讨论】:

    标签: mysql django django-queryset


    【解决方案1】:

    您的问题可能是 [-1] 索引(在 python 中表示“获取最后一项”)不适用于查询集:

    > YourModel.objects.order_by('id')[-1]
    Traceback
    ...
    AssertionError: Negative indexing is not supported.
    

    简单的解决方法是颠倒顺序,得到第一个,这正是你在手写 SQL 中所做的:

    > YourModel.objects.order_by('-id')[0]
    <YourModel....>
    

    - 放在列名前面会颠倒排序顺序。所以这可能就是您需要的提示。

    从 Django 1.6 开始,查询集上有特殊的 .first().last() 方法,请参阅 Django's docs。对你来说它看起来像这样:

    > YourModel.objects.order_by('id').last()
    <YourModel....>
    

    接下来,您只想获得价值。为此,Django 有 .values().values_list()。如果我只想要一个单一值的列表,我经常使用.values_list('some single field', flat=True)。在你的情况下:

    > YourModel.objects.order_by('id').values_list('column_name', 
                                                   flat=True).last()
    1234
    

    当然,在这种情况下,仅从对象中获取值会更短:

    > YourModel.objects.order_by('id').last().column_name
    1234
    

    【讨论】:

    • 你说的相当于SELECT * FROM table_name ORDER BY id DESC LIMIT 1。但是,从这个对象,我怎样才能得到一列的值? -> SELECT column_name FROM table_name ORDER BY...
    • 好的,知道了。我首先得到对象,然后得到它的一个字段。我为我难以置信的无知道歉。非常感谢!
    • 啊,你是对的。我已经扩展了我的答案以获取价值。提示:用 Django 的 values()values_list() 试验一段时间。至少,我花了一段时间才熟悉它。尤其是与.annotate() 结合使用时,与.values() 一起使用时会执行自动分组。强大,但需要一些时间来适应。
    • 我会做的。谢谢你的提示! ;)
    • 关于“先获取对象,然后获取其中一个字段”:在这种情况下,这将是最快的方法。在其他情况下,.values_list() 可能是最方便的。我再次编辑了答案以包括“仅从对象中获取字段”替代方案。
    【解决方案2】:

    等价物如下:

    YourModel.objects.order_by('column_name')[0]
    

    有关文档,请参阅 here

    【讨论】:

    • 他希望它由id 订购,而不是column_name。他想要的是最后一个值,而不是第一个值。
    • 井号也是列名
    • 你是对的。这个问题可以用更好的措辞来表达,“column_name”太笼统了,让谈论这个变得更加困难:-)。他的 SQL(“有效”)包含 ORDER BY id DESC,我认为它的意思是“按 id 排序”。
    猜你喜欢
    • 2018-06-24
    • 2010-12-23
    • 2013-06-04
    • 1970-01-01
    • 2014-10-26
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多