给出以下代码:
randomItemQS = Item.objects.filter().exclude(id__in=[o.id for o in collection]).order_by('?')
randomItem = randomItemQS[:1]
calculation = randomItem.method() / constant
如何确保randomItem
是Item
而不是QuerySet?
如果我从manage.py shell
运行代码,那么我会得到预期的结果。但是,从视图运行此代码会导致AttributeError 'QuerySet' object has no attribute 'method'
,并指示错误发生在最后一行。
我错过了什么?
编辑:对不起,我应该更具体一点 - 我在shell中工作得很好,但它在视图中不起作用。会有什么不同?答案 0 :(得分:2)
只需将其编入索引,切片会向QS添加LIMIT查询而不执行它:
randomItem = randomItemQS[0]
答案 1 :(得分:1)
你可以这样做:
randomItem=None
randomItemQS = Item.objects.filter().exclude(id__in=[o.id for o in collection]).order_by('?')[:1]
if randomItemQS:
randomItem = randomItemQS[0]
calculation = randomItem.method() / constant
答案 2 :(得分:0)
由于问题是关于视图和shell窗口之间的区别,正确的答案是将传递给视图的参数转换为整数,以确保查询按预期返回对象。
其他答案已被相应提升,因为它们是有效的。感谢。