我有一个带有预定义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>
为什么会这样?是否有一些关于此的最佳实践?
答案 0 :(得分:1)
不要认为查询集是默认排序的。虽然它似乎没有在doc中明确提及,但是这可以给出一些提示
上警告:
订购不是免费操作。添加到订购的每个字段都会导致数据库的成本。您添加的每个外键都将隐式包含其所有默认排序。
因此,如果您未指定任何默认排序字段,则不会对订阅集进行排序。
样品:
>>> 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