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

Jun*_*une 2 django

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

例如:

class A(models.Model):
    created = models.DateTimeField(auto_now=True)

    class Meta:
        get_latest_by = 'created'
Run Code Online (Sandbox Code Playgroud)

但由于 djangoDateTimeField仅支持秒,没有微秒支持,我认为我的系统无法正确从查询集中检索最新对象。

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

因此,我尝试在类中使用pkforget_latest_by属性Meta而不是created,但由于我对 和 如何latest()协同get_latest_by工作缺乏深入的了解,我不确定放置get_latest_by = 'pk'.

直接放就可以吗get_latest_by = 'pk'latest()django 的背面到底做了什么?

Ane*_*pic 5

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_by是,latest不允许您指定复合排序(并且它会删除默认pk排序),因此您可能更愿意手动执行以下操作:

.order_by('-created', '-pk').get()
Run Code Online (Sandbox Code Playgroud)

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