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]