我有一个模型:
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()
行为异常是否正确吗?
这对我有效
documentation说
这意味着,当您启动
MyModel.objects.latest()
时,您将根据日期/时间字段获得最新的实例。当我使用示例数据测试您的代码时,它确实做到了。你误解了
latest()
的工作方式。当调用MyModel.objects时,它返回 表中的最新实例。当对queryset调用时,latest
将返回queryset中的第一个对象。您的queryset包含所有按creation_date
升序排列的MyModel
实例。只有这样,这个queryset上的latest
才应该首先返回queryset的行。这碰巧是表中最早的一行。一种更好的理解方法是查看为
latest
激发的查询。案例1:
这张照片:
注意按
creation_date DESC
和LIMIT
子句排序。前者是由于get_latest_by
,后者是latest
的贡献。现在,案例2:
印刷品
请注意,顺序已更改为
creation_date ASC
。这是显式order_by
的结果。LIMIT
是附加在er上的,稍后由latest
提供。让我们也看看第3种情况:您显式地为
objects.latest()
指定field_name
。显示
我想这是一个已知的bug in Django,在1.3发布后被修复。
相关问题 更多 >
编程相关推荐