3

给定以下代码:

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 中工作得很好,但它在视图中不起作用。会有什么不同?

4

3 回答 3

3

只需索引它,切片将 LIMIT 查询添加到 QS 而不执行它:

randomItem = randomItemQS[0]
于 2013-04-10T14:25:50.853 回答
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
于 2013-04-10T14:29:13.610 回答
0

由于问题是关于视图和 shell 窗口之间的区别,因此正确的答案是将传递给视图的参数转换为整数,以确保查询按预期返回对象。

其他答案已被相应地投票,因为它们是有效的。谢谢。

于 2013-04-10T15:32:35.507 回答