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'行吗?那么,江户十一〔八〕在姜戈的背后究竟做了什么?
- 使用.order ou by()和.latest()的django查询可能重复
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排序),因此您可能更愿意手动执行以下操作:
1
| .order_by('-created', '-pk').get() |
(请注意,get获取查询集中的第一个项目,因此需要使用-前缀反转订单以获取最新的项目)