Django:order_by('?')有奇怪的outcom

2024-06-25 06:13:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: thedjangoobjectssonganotherallshellface
1条回答
网友
1楼 · 发布于 2024-06-25 06:13:57

再打几次a[0](或a)。您会注意到它每次都随机地洗牌元素。这是因为a指向queryset,而不是list

要理解queryset每次都重新排序的原因,请设想以下场景:您需要按字母顺序从集合中获取所有元素。然而,元素不断地被添加到集合中。如果每次访问查询集时它们都没有按顺序排列,则有可能使最近添加的元素出现无序

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

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

相关问题 更多 >