使用Django ORM和postgres的奇怪排序结果

时间:2013-11-28 11:06:12

标签: python django orm

我有一个带有预定义Meta.ordering的专辑曲目模型。在我的调试器中,我被这样的东西咬了:

pdb> album.tracks.all()[0]
<Track: track 2>
ipdb> album.tracks.all() # WTF ?
[<Track: track 1>, <Track: track 2>]
ipdb> m = album.tracks.all()
ipdb> m[0]
<Track: track 2>
ipdb> m = list(album.tracks.all())
ipdb> m[0]
<Track: track 1>

为什么会这样?是否有一些关于此的最佳实践?

1 个答案:

答案 0 :(得分:1)

不要认为查询集是默认排序的。虽然它似乎没有在doc中明确提及,但是这可以给出一些提示

orderingorder_by()

  

警告:

     

订购不是免费操作。添加到订购的每个字段都会导致数据库的成本。您添加的每个外键都将隐式包含其所有默认排序。

因此,如果您未指定任何默认排序字段,则不会对订阅集进行排序。

样品:

>>> from myapp.models import *
>>> a=MyModel.objects.all()
>>> a.ordered
False
>>> b=MyModel.objects.all().order_by()
>>> b.ordered
False
>>> c=MyModel.objects.all().order_by('id')
>>> c.ordered
True