从Django queryset获取第一个对象

时间:2013-04-10 14:23:57

标签: django django-queryset

给出以下代码:

randomItemQS = Item.objects.filter().exclude(id__in=[o.id for o in collection]).order_by('?')
randomItem = randomItemQS[:1]
calculation = randomItem.method() / constant

如何确保randomItemItem而不是QuerySet?

如果我从manage.py shell运行代码,那么我会得到预期的结果。但是,从视图运行此代码会导致AttributeError 'QuerySet' object has no attribute 'method',并指示错误发生在最后一行。

我错过了什么?

编辑:对不起,我应该更具体一点 - 我在shell中工作得很好,但它在视图中不起作用。会有什么不同?

3 个答案:

答案 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窗口之间的区别,正确的答案是将传递给视图的参数转换为整数,以确保查询按预期返回对象。

其他答案已被相应提升,因为它们是有效的。感谢。