我有一个看起来像这样的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
答案 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()