我重命名了Django项目中的一个应用程序,试图遵循所有的“最佳实践”,也就是说,我重命名了项目文件夹、迁移(在project + PostgreSQL中)、DB内容类型和表名。
一切正常,除了一件事:myfavmodel.objects.all()
返回的对象的顺序似乎是随机的,即不按ID递增排序,但当我调用myfavmodel.objects.all()
时,它总是相同的。更奇怪的是,重命名的应用中的一些模型显示这种行为,而其他模型显示正常的行为,即它们的对象按ID递增排序返回。
我可以通过将ordering = ['id']
添加到我的模型的 meta类中来相当容易地解决这个问题,但是我想了解是什么导致了这种行为。myfavmodel.objects.all()[:20].values_list('id', flat=True)
退货[709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 1095, 394]
但等效的SQL查询不
select id from myfavmodel limit 20;
id
----
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(20 rows)
1条答案
按热度按时间t98cgbkg1#
在Django中,模型对象的默认顺序由模型的
Meta
类中的ordering
属性决定。如果没有定义这个属性,那么默认顺序是undefined
,并且数据库后端可以以任何顺序返回对象。除非显式指定默认的
ordering
,否则不能保证myfavmodel.objects.all()
返回的对象的顺序是按ID递增排序的。通常建议定义一个默认的
ordering
,它可以被数据库后端有效地使用,并且在必要时使用order_by()
来指定替代的排序。