在 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('?'))
关于python - Django: order_by ('?' ) 有奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35642550/