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

How to use Meta attribute get_latest_by properly with pk in django?

我使用q.latest()从查询集中检索最新的对象,在模型的Meta类中设置get_latest_by = 'created'

例如:

1
2
3
4
5
class A(models.Model):
    created = models.DateTimeField(auto_now=True)

    class Meta:
        get_latest_by = 'created'

但是由于Django的DateTimeField只支持到秒,没有微秒支持,我认为我的系统没有从查询集中正确地检索到最新的对象。

这可能是因为表中有一些记录具有相同的created值,尽管它们不是在完全相同的时间(微秒内)创建的。

所以我想用pk来表示Meta类中的get_latest_by属性,而不是created,但是由于我对latest()get_latest_by的工作方式缺乏深入的了解,我不确定把get_latest_by = 'pk'放在一起是否正确。

只放get_latest_by = 'pk'行吗?那么,江户十一〔八〕在姜戈的背后究竟做了什么?


latest基本上只是order_by后接get获取get_latest_by字段排序的查询集中最后一项的快捷方式。

pk订购是可以的,但它依赖于有关应用程序和数据库后端工作方式的假设(例如,您从高位pk 9999开始导入数据…如果以后插入新数据,它是否会"填充"丢失的1、2、3、100、2000个键?)

今后,django将支持微秒级的https://code.djangoproject.com/ticket/19716

目前最好的办法是将两者结合起来,即order_by('created', 'pk')

不幸的是,get_latest_bylatest不允许您指定复合排序(它删除了默认的pk排序),因此您可能更愿意手动执行以下操作:

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

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