Python django教程第1部分(p.choice\u set.all()按相反顺序返回)

Python django教程第1部分(p.choice\u set.all()按相反顺序返回),python,django,Python,Django,我正在学习Django教程,在第1部分的末尾,调用了p.choice_set.all,我得到了相反的显示顺序 例如,我得到:只是黑客再次,天空,没有太多 而不是:不多,天空,只是再次黑客攻击 你知道为什么我会得到相反的顺序吗?我按照教程所示的顺序键入了它 我正在使用PostgreSQL运行。简单说明: 您可以按order\u by对字段进行排序,如果不使用它,它将按id排序。这就是为什么您会获得revere order 您可以通过简单的for循环进行检查: for item in p.choic

我正在学习Django教程,在第1部分的末尾,调用了p.choice_set.all,我得到了相反的显示顺序

例如,我得到:只是黑客再次,天空,没有太多 而不是:不多,天空,只是再次黑客攻击

你知道为什么我会得到相反的顺序吗?我按照教程所示的顺序键入了它

我正在使用PostgreSQL运行。

简单说明:

您可以按order\u by对字段进行排序,如果不使用它,它将按id排序。这就是为什么您会获得revere order

您可以通过简单的for循环进行检查:

for item in p.choice_set.all():
    print item.id

谢谢

如果您没有明确执行订单,则无法保证返回结果的顺序

不确定PostgreSQL,但对于MySQL,在实践中,如果您仅根据某个索引列选择行的子集,它将按该索引排序,但如果您选择每一行,它将使用表扫描并按结果在磁盘上的存储顺序返回结果

关于磁盘顺序,如果您曾经删除过一行,那么当您下次插入一行时,它将尝试填充该行使用的空间,因此如果您有

ID   Name
1    Bob
2    Fred
3    Jim
…然后删除第一行,然后添加一个新行,您将得到

ID   Name
4    Jeff
2    Fred
3    Jim

…此时,从my_表中选择*将按顺序4、2、3返回它们,而从id>1的my_表中选择*可能按顺序2、3、4返回它们。

您想按哪个字段排序?显然,在这两种情况下,它都不是按选择文本排序。如果未给出排序,则默认值为ID本部分教程:反之亦然:轮询对象访问选项对象。>>>p、 选择_set.all[,]我倒过来了^….只是再次黑客攻击,天空,不是太可能是数据库问题或怪癖?它以相反的方式显示。也许指南不是最新的,或者他们正在对另一个dbFYI运行指南:您可以按任意字段订购您自己的p.choice\u set.all.order\u by'choice\u text'。我不知道你提到的这种奇怪的行为。教程是。。。有限。默认顺序是按id升序而不是按id降序。这是我们所知道的。我运行了你的循环,它以相反的方式打印。。。15 14因此无法保证,我们可以放心地说,这正是PostgreSQL的工作方式。非常有洞察力。谢谢不保证。嗯。@klandshome PostgreSQL不一定总是这样工作的——它可能只是针对特定的情况。如果你放下并重新创建表格,你可能会以不同的顺序得到它。@klandshome也看到了。a你是对的。这是没有保证的。唯一有保证的方法是按您的_列使用ORDER。我想这就是它的工作原理。很奇怪。谢谢你的教育。