我原本希望.Latest()始终根据(Date)(Time)字段返回最新的实例.
documentation人说
如果您的模型Meta
指定为get_latest_by
,则可以将field_name
参数go 掉为latest()
.默认情况下,Django将使用get_latest_by
中指定的字段.
所有这些都意味着,当您触发MyModel.objects.latest()
时,您将获得基于日期/时间字段的最新实例.当我使用示例数据测试您的代码时,它确实做到了.
后来我想要instances.Latest(),但它不会给我正确的实例,实际上它给了我第一个实例.
你误解了latest()
的工作方式.在MyModel.objects上调用时,它返回
table号公路的最新实例.在queryset上调用时,latest
将返回the queryset中的第一个对象.您的查询集由按升序排序的MyModel
的所有实例组成.那么,该查询集上的latest
应该返回first行of the queryset是很自然的.顺便说一句,这是table排中最古老的一排.
更好地理解的一种方法是查看为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
的功劳.
现在, case 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
的结果.一百零二号是贴在呃后面礼节一百零三号上的.
让我们再看一看 case 3:明确指定field_name
代表objects.latest()
.
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