Django:order_by('?')有奇怪的结果

时间:2016-02-26 02:54:22

标签: python django django-views

在django shell中:

>>> queryset = Song.objects.all()
>>> a=queryset.order_by('?')
>>> queryset
[<Song: Up All Night>,  <Song: 1973>, <Song: The Luckiest>, <Song: Another Love>, <Song: Face the Sun>]
>>> a
[<Song: The Luckiest>, <Song: 1973>, <Song: Face the Sun>, <Song: Another Love>, <Song: Up All Night>]
>>> a[0].name
'1973'
你知道,最后两个输出相互矛盾。

1 个答案:

答案 0 :(得分:1)

再次尝试拨打a[0](或只是a)。您会注意到它每次都会随机地随机播放元素。这是因为a指的是queryset,而不是list

要理解每次queryset重新排序的原因,请想象一下这个场景:您需要按字母顺序从集合中获取所有元素。但是,元素不断被添加到集合中。如果每次访问查询集时它们都没有按顺序排列,那么您最近添加的元素可能会出现故障。

如果您想以随机顺序获取元素列表(并且每次获取元素时都没有随机播放),您可以使用

a = list(queryset.order_by('?'))