我完全了解了python。 但是现在我需要一个包含MyObject-objects的简单存储器用于某个项目。 每个对象都包含一些没什么特别的StringProperties。
现在我想从我的MyObjects列表中获取10个随机对象,并将它们存储在其他数组中。
所以我去搜索并找到random.sample并开始实现它。
def get10RandomMyObjects():
# waarders maken
dict = {}
myObjectsList = []
# Lijst vullen
myObjects = MyObject.all()
randomMyObjects = random.sample(myObjects, 10)
for o in randomMyObjects:
dict_myObject = { }
#some random property setting
myObjectsList.append(dict_myObject)
dict['myObjects'] = myObjectsList
return dict
这是我回来的错误:
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/random.py", line 314, in sample
n = len(population)
TypeError: object of type 'Query' has no len()
所以很明显random.sample有问题,但我的noobness不能解释它是什么。 任何人都在意我解释为什么我无法获得那些我想要的10个随机MyObjects?
答案 0 :(得分:2)
看起来Query对象是一个生成器。 random.sample
想知道有多少项目可以创建样本。因此,最简单的方法是将要采样的项目放在列表中:
randomMyObjects = random.sample(list(myObjects), 10)
答案 1 :(得分:1)
random.sample()
没有错。发生的事情是myObjects
不是集合。
最有可能的是,myObjects
是一个迭代器。在random.sample()
中使用它之前,您必须将其转换为列表:
randomMyObjects = random.sample(list(myObjects),10)
答案 2 :(得分:1)
random.sample()
适用于列表。显然,MyObject.all()
不会返回列表而是返回Query
个对象。如果Query
至少是可迭代的,那么你可以写:
myObjects = list(MyObject.all())
否则,您必须手动从MyObject.all()
创建一个列表。
答案 3 :(得分:1)
您也可以使用:
randomMyObjects = MyObject.all().order_by('?')[:10]
哪个更快,因为它会让数据库执行随机排序,只将10个第一个对象加载到内存中。