postgresql Django在应用重命名后随机返回模型对象

dauxcl2d  于 2023-02-15  发布在  PostgreSQL
关注(0)|答案(1)|浏览(119)

我重命名了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)
t98cgbkg

t98cgbkg1#

Django中,模型对象的默认顺序由模型的Meta类中的ordering属性决定。如果没有定义这个属性,那么默认顺序是undefined,并且数据库后端可以以任何顺序返回对象。
除非显式指定默认的ordering,否则不能保证myfavmodel.objects.all()返回的对象的顺序是按ID递增排序的。
通常建议定义一个默认的ordering,它可以被数据库后端有效地使用,并且在必要时使用order_by()来指定替代的排序。

相关问题