我正在使用q.latest()从查询集中检索最新的对象,在其模型的get_latest_by = 'created'
类中设置Meta
。
例如:
class A(models.Model):
created = models.DateTimeField(auto_now=True)
class Meta:
get_latest_by = 'created'
但是由于django的DateTimeField
只支持秒,没有微秒支持,我认为我的系统没有正确地从查询集中检索最新的对象。
也许这是因为表中有一些记录具有相同的created
值,但它们不是在完全相同的时间(微秒内)创建的。
所以我试图在pk
课程中使用get_latest_by
Meta
属性,而不是created
,但由于缺乏对latest()
的深入理解1}}和get_latest_by
一起工作,我不确定只是放get_latest_by = 'pk'
是正确的方法。
可以放get_latest_by = 'pk'
吗? latest()
在django的背面究竟做了什么?
答案 0 :(得分:2)
latest
基本上只是order_by
的快捷方式,后跟get
来获取get_latest_by
字段排序的查询集中的最后一项。
pk
订购是可以的,但它依赖于有关您的应用和数据库后端如何工作的假设(例如,您从高数字pk 9999开始导入数据......它是否会填写'填写&# 39;如果您以后插入新数据,则缺少1,2,3,100,2000个键?)
将来Django将支持微秒https://code.djangoproject.com/ticket/19716
现在最好的办法是将两者结合起来,即order_by('created', 'pk')
遗憾的是get_latest_by
和latest
不允许您指定复合排序(并且它会删除默认的pk
排序),因此您可能更愿意手动执行:
.order_by('-created', '-pk').get()
(请注意get
获取查询集中的第一个项,因此您需要使用-
前缀反转订单以获取最新 >)