如何在django中正确使用元属性get_latest_by和pk?

时间:2015-05-20 02:53:07

标签: django

我正在使用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的背面究竟做了什么?

1 个答案:

答案 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_bylatest不允许您指定复合排序(并且它会删除默认的pk排序),因此您可能更愿意手动执行:

.order_by('-created', '-pk').get()

(请注意get获取查询集中的第一个项,因此您需要使用-前缀反转订单以获取最新 >)