如何获得具有最大字段值的Django模型?

时间:2015-09-06 08:40:06

标签: python django orm

我有一个看起来像这样的Django类:

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

如何为给定的created_ts值获取具有最新my_integer的模型实例(而不仅仅是字段的值)?我认为下面的行使用 annotate 会起作用,但是我将所有3个MyModel实例重新调整为my_integer==77而不是我期望的单个值。奇怪的是,这三个实例中的每一个都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

1 个答案:

答案 0 :(得分: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()