我本来期望
.latest()
根据一个(日期)(时间)字段,总是返回最新的实例。根据
文档,如果你的模型的Meta指定了
get_latest_by
,你可以略去
field_name
参数传递给
latest()
。Django会默认使用
get_latest_by
中指定的字段。这意味着当你调用
MyModel.objects.latest()
时,你将得到基于日期/时间字段的最新实例。我使用示例数据测试了你的代码,确实如此。
另外,你误解了
latest()
的工作方式。当在
MyModel.objects上调用它时,它返回表中的最新实例。当在
queryset上调用
latest()
时,则返回
查询集中的第一个对象。你的查询集由按照
creation_date
升序排列的
MyModel
所有实例组成。因此,
latest()
在这个查询集上应该返回
查询集的
第一行。这恰好是表中最旧的行。
要更好地理解,请查看为
latest()
所执行的查询语句。
Case 1:
from django.db import connection
MyModel.objects.latest()
print connection.queries[-1]['sql']
这将打印:
SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM
"app_mymodel" ORDER BY "app_mymodel"."creation_date" DESC LIMIT 1
注意按 creation_date DESC
的顺序和 LIMIT
子句。前者是由 get_latest_by
负责,而后者则是由 latest
贡献的。
现在,进入情况2:
MyModel.objects.order_by('creation_date').latest()
print connection.queries[-1]['sql']
打印
SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM
"app_mymodel" ORDER BY "app_mymodel"."creation_date" ASC LIMIT 1
注意,排序已更改为
creation_date ASC
。 这是显式
order_by
的结果。
LIMIT
稍后会添加,感谢
latest
。
让我们再看一下第三种情况:在
objects.latest()
中显式指定
field_name
。
MyModel.objects.latest('id')
print connection.queries[-1]['sql']
显示
SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM "app_mymodel"
ORDER BY "app_mymodel"."id" DESC LIMIT 1