Django查询使用.order_by()和.latest()
我有一个模型:
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而不是在视图中手动testing时,也会发生这种情况。
所以我现在所做的是在模型的元我列出order_by = ['creation_date']
并没有在查询中使用,并且工作。
我会期望.latest()
总是返回基于(date)(时间)字段的最近的实例。 任何人都可以告诉我,在查询中使用order_by
时, .latest()
行为是否奇怪?
我会期望.latest()总是返回基于(date)(时间)字段的最近的实例。
文件说这个
如果你的模型的
Meta
指定了get_latest_by
,你可以把field_name
参数设置为latest()
。 Django将默认使用get_latest_by
指定的字段。
所有这一切意味着,当你触发MyModel.objects.latest()
你将得到基于date/时间字段的最新实例。 当我使用示例数据testing您的代码时,确实如此。
后来我想要instances.latest(),但它不会给我正确的实例,实际上它给了我第一个实例。
你误解了latest()
工作方式。 在MyModel.objects上调用时,它将返回表中的最新实例。 在查询集上调用时, latest
将返回查询集中的第一个对象。 您的MyModel
由creation_date
按升序排列的MyModel
的所有实例。 这个查询集的latest
应该返回查询集的第一行是很自然的 。 这偶然碰巧是表中最古老的一排。
更好地理解的一种方法是查看latest
的查询。
情况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
请注意,sorting已更改为creation_date ASC
。 这是显式order_by
的结果。 LIMIT
是呃,稍后礼貌latest
。
让我们来看看情况3:你明确地指定了field_name
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
我猜这是在Django 1.3发布后修复的一个已知bug 。
这对我有效
latestsetuplist = SetupTemplate.objects.order_by('-creationTime')[:10][::1]