使用.order_by()和.latest()的Django查询

使用.order_by()和.latest()的Django查询,第1张

使用.order_by()和.latest()的Django查询

我本来希望.latest()总是基于(date)(time)字段返回最新的实例

该文件说

如果

meta
指定了模型
get_latest_by
,则可以忽略的
field_name
参数
latest()
。Django
get_latest_by
默认会使用中指定的字段。

所有这些意味着,当您触发时,

MyModel.objects.latest()
您将基于日期/时间字段获得最新的实例。当我使用示例数据测试您的代码时,确实可以。

然后,稍后我需要instances.latest(),但是它不会给我正确的实例,实际上它给了我第一个实例。

您误解了工作方式

latest()
。当所谓的 MyModel.objects 它在返回的最新实例 。当一个叫做 查询集
latest
将在返回的第一个对象 的查询集
。您的查询集包括了所有实例的
MyModel
排序由
creation_date
升序排列。这是很自然那么
latest
这个查询集应该返回 第一
的查询集的 。碰巧这是 表中 最旧的行。

一种更好理解的方法是查看为触发的查询

latest

情况1:

from django.db import connectionMyModel.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

请注意by

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_dateASC
。这是显式 *** 作的结果
order_by
。该
LIMIT
是上涨了急诊室,后来礼貌
latest

让我们还看一下情况3:在其中显式指定

field_name
for
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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5662861.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存