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将返回查询集中第一个对象。 您的MyModelcreation_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 DESCLIMIT子句的顺序。 前者要感谢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]