我有一个模型:

class MyModel(models.Model):
   creation_date = models.DateTimeField(auto_now_add = True, editable=False)

   class Meta:
      get_latest_by = 'creation_date'

在我看来,我有一个问题是:

instances = MyModel.objects.all().order_by('creation_date')

然后后来我想要instances.latest(),但它不给我正确的实例,实际上它给了我第一个实例.只有当我将ORDER_BY设置为-creation_date或从查询中实际删除ORDER_BY时,.latest()才会给出正确的实例.当我使用python manage.py shell而不是在视图中手动测试时,也会发生这种情况.

所以我现在做的是在模型的Meta中,我列出了order_by = ['creation_date']个,但没有在查询中使用,这是有效的.

我原本期望.latest()总是根据(日期)(时间)字段返回最新的实例.有人能告诉我,当您在查询中使用order_by时,.latest()的行为异常是否正确?

推荐答案

我原本希望.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应该返回firstof 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

Django相关问答推荐

获取PyCharm中继承方法的未解析属性引用

通过 B 的外键列表访问模型 B 的行

源自访问外键关系的模型方法 get_absolute_url 的 django 重复 SQL 查询

如何将数据库中的 None 序列化为空对象?

Django授权判断具有通配符模式的URL

Django:如何在表单 clean() 方法的 django 验证错误中添加 超链接?

如何将表单中的用户字段设置为当前登录的用户?

所有子元素的Django自递归外键过滤器查询

如何使用 jQuery 建立 Django 网站

可插拔应用程序的Django默认设置约定?

Django 密码以什么格式存储在数据库中?

如何在 forms.Form 子类上动态设置 models.ModelChoiceField 的查询集

如何从 django 自定义中间件类返回 rest_framework.response 对象?

Django - 如何从模型中 Select 特定列?

base.html 中的 Django 变量

PyCharm 无法正确识别需求 - Python、Django

如何在不发送信号的情况下保存模型?

在 Django 中使用 Cython,是否有意义?

AUTH_USER_MODEL 指的是尚未安装和创建的模型 .. AbstractUser 模型无法登录

Django 中的自定义 HTTP 标头