Skip to main content
 首页 » 编程设计

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

2025年05月04日26jillzhang

在 Django 外壳中:

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

你看,最后两个输出相互矛盾。

请您参考如下方法:

尝试多次调用 a[0](或只是 a)。您会注意到它每次都会随机打乱元素。这是因为 a 指向 queryset,而不是 list。

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

如果您想以随机顺序获取元素列表(而不是每次抓取元素时都让它们洗牌),您可以使用

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