2016-02-26 55 views
2

在Django壳:Django的:( '?')ORDER_BY有奇怪的结果

>>> 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

尝试拨打a[0](或只是a)多一些。你会注意到它每次都随机洗牌。这是因为a指向queryset,而不是list

要理解为什么queryset每次都重新排序,想象一下这种情况:您需要从字母顺序中获取集合中的所有元素。然而,元素不断被添加到集合中。如果每次访问查询集时都没有按顺序排列,则可能会导致最近添加的元素出现故障。

如果你想获得的元素列表按随机顺序(而不是让他们每次抓住一个元素时洗牌),你可以使用

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

非常感谢你,这就是我想要的。 – sac7e