【发布时间】: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
【问题讨论】: