2

https://docs.djangoproject.com/en/1.5/intro/tutorial01/

我正在关注 Django 教程,在第 1 部分结束时调用 p.choice_set.all() 时,我以相反的顺序显示。

例如,我得到:Just hacking again, The Sky, Not much 代替:Not much, The sky, Just hacking again

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

我正在使用 PostgreSQL 运行。

4

2 回答 2

2

如果您没有明确执行,order_by()则无法保证返回结果的顺序。

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

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

ID   Name
1    Bob
2    Fred
3    Jim

...然后删除第一行,然后添加一个新行,你得到...

ID   Name
4    Jeff
2    Fred
3    Jim

...此时 aSELECT * FROM my_table将按 4、2、3 的顺序返回它们,而 aSELECT * FROM my_table WHERE id > 1将(可能)按 2、3、4 的顺序返回它们。

于 2013-06-18T07:50:49.757 回答
1

简单解释:

您可以按 排序字段order_by(),如果您不使用它,它将按 id 排序。这就是您获得崇高顺序的原因。

您可以通过简单的 for 循环来检查它:

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

谢谢

于 2013-06-18T06:58:38.743 回答