【问题标题】:How to get the Django model with maximum field value?如何获得具有最大字段值的 Django 模型?
【发布时间】:2015-09-06 08:40:06
【问题描述】:

我有一个如下所示的 Django 类:

class MyModel(models.Model):
    my_integer = models.IntegerField(default=-1)
    created_ts = models.DateTimeField(default=datetime.utcnow, editable=False)

对于给定的my_integer 值,如何获取具有最新created_ts 的模型实例(不仅仅是字段的值)?我认为下面使用 annotate 的行会起作用,但是这使我得到了 MyModel 的所有 3 个具有 my_integer==77 的实例,而不是我期望的单个值。奇怪的是,这 3 个实例中的每一个都将 last_created 设置为自己的 created_ts,而不是所有匹配实例的最大值。

>>> len(MyModel.objects.filter(my_integer=77))
3

>>> from django.db.models import Max, F
>>> x = MyModel.objects.filter(my_integer=77).annotate(last_created=Max('created_ts')).filter(created_ts=F('last_created'))
>>> len(x)
3

>>> print x[0].my_integer, x[0].created_ts, x[0].last_created
77 2015-09-07 07:46:27.343869 2015-09-07 07:46:27.343869

>>> print x[1].my_integer, x[1].created_ts, x[1].last_created
77 2015-09-12 07:46:27.343869 2015-09-12 07:46:27.343869

>>> print x[2].my_integer, x[2].created_ts, x[2].last_created
77 2015-09-13 07:46:27.343869 2015-09-13 07:46:27.343869

【问题讨论】:

    标签: python django orm


    【解决方案1】:

    您可以在查询集上使用.latest()。所以你可以得到对象

    obj = MyModel.objects.filter(my_integer=77).latest('created_ts')
    

    您也可以使用.order_by().first()

    obj = obj = MyModel.objects.filter(my_integer=77).order_by('-created_ts').first()
    

    【讨论】:

    • 哇。这很有帮助。谢谢你告诉我.latest()
    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2020-07-07
    • 2019-01-25
    相关资源
    最近更新 更多