TypeError:“方法”对象不可迭代 MySQL
Posted
技术标签:
【中文标题】TypeError:“方法”对象不可迭代 MySQL【英文标题】:TypeError: 'method' object is not iterable MySQL 【发布时间】:2016-08-15 17:04:43 【问题描述】:当我尝试从mysql
表中获取数据并将其分配给queryset
时,我得到一个TypeError
,在Django ModelViewSet
中使用以下代码
def queryset(self, request):
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='password123', db='sakila')
cur = conn.cursor()
cur.execute("SELECT city_id, city, country_id FROM city")
json.dumps(list(cur))
cur.close()
conn.close()
它给了我以下错误
异常值: “方法”对象不可迭代
我做错了什么?有什么解决办法吗?我是个菜鸟,所以如果你也能解释一下解决方案,那就太好了。
Traceback:
File "C:\Users\Naila Akbar\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
> File "C:\Users\Naila Akbar\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
> File "C:\Users\Naila Akbar\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
> File "C:\Users\Naila Akbar\AppData\Local\Programs\Python\Python35-32\lib\site-packages\rest_framework\viewsets.py" in view
87. return self.dispatch(request, *args, **kwargs)
> File "C:\Users\Naila Akbar\AppData\Local\Programs\Python\Python35-32\lib\site-packages\rest_framework\views.py" in dispatch
466. response = self.handle_exception(exc)
> File "C:\Users\Naila Akbar\AppData\Local\Programs\Python\Python35-32\lib\site-packages\rest_framework\views.py" in dispatch
463. response = handler(request, *args, **kwargs)
> File "C:\Users\Naila Akbar\AppData\Local\Programs\Python\Python35-32\lib\site-packages\rest_framework\mixins.py" in list
48. return Response(serializer.data)
> File "C:\Users\Naila Akbar\AppData\Local\Programs\Python\Python35-32\lib\site-packages\rest_framework\serializers.py" in data
674. ret = super(ListSerializer, self).data
> File "C:\Users\Naila Akbar\AppData\Local\Programs\Python\Python35-32\lib\site-packages\rest_framework\serializers.py" in data
239. self._data = self.to_representation(self.instance)
> File "C:\Users\Naila Akbar\AppData\Local\Programs\Python\Python35-32\lib\site-packages\rest_framework\serializers.py" in to_representation
614. self.child.to_representation(item) for item in iterable
> Exception Type: TypeError at /cities/
> Exception Value: 'method' object is not iterable
【问题讨论】:
请包含您的异常的完整回溯,因为不清楚该错误来自何处。 @MartijnPieters 我不知道如何包含回溯但我尝试.. 我看不到它在您发布的代码中发生的位置,但由于错误是'method' object is not iterable
并且您有一个名为 queryset
的方法和一个名为 queryset
的本地变量我怀疑他们在某个地方混在一起,但我不知道在哪里。尝试更改其中一个名称,看看它是否会发生任何变化。
@nephlm 试过了..还是一样
【参考方案1】:
如果您使用的是 Django REST 框架,那么您应该生成 模型实例(数据库结果)或简单的 Python 原语(内置类型),并且它会为您处理序列化为 JSON。通过抽象出序列化,框架可以实现内容协商,客户端可以在其中选择接收数据的格式。可以是 JSON,但也可以是其他格式。我怀疑返回 JSON 字符串会打乱框架所做的假设。
在 rest_framework.response.Response
对象中返回您的光标数据,而不是不要自己序列化它:
from rest_framework.response import Response
from contextlib import closing
# ...
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='password123', db='sakila')
with closing(conn), conn as cur:
with cur:
cur.execute("SELECT city_id, city, country_id FROM city")
return Response(list(cur))
来自Responses section in the API Guide:
REST 框架通过提供
Response
类支持 HTTP 内容协商,该类允许您返回可呈现为多种内容类型的内容,具体取决于客户端请求。
Response
类是 Django 的SimpleTemplateResponse
的子类。Response
对象使用数据进行初始化,该数据应包含原生 Python 原语。然后 REST 框架使用标准 HTTP 内容协商来确定它应该如何呈现最终响应内容。
在上面的例子中我也使用contextlib.closing()
来确保即使视图中出现异常也关闭连接,然后使用连接作为上下文管理器来产生游标,然后游标也确保它已关闭。
如果您确实有一个实际模型,请使用 Django ORM,不要自己创建直接连接。您正在使用一台集成良好的大型机器,但这里忽略了 95% 的机器。您不会获得连接池、事务管理、分页等。在这种情况下,只需使用适当的查询集和模型视图。
【讨论】:
我正在这样做 cur.execute("SELECT city_id, city, country_id FROM city") queryset = json.dumps(list(cur)) @NullPointer:是的,没错。请为您的问题添加完整的回溯,因为如果您仍然收到该错误,则 您发布的代码不是原因。 @NullPointer:你的函数有返回什么吗? @NullPointer:另外,我看到您正在使用 Django REST 框架来处理此特定功能。框架将无法像这样处理已经序列化的数据。 是的,我正在研究 django 休息框架并使用返回序列化类和查询集的 ModelViewSet 来处理数据以上是关于TypeError:“方法”对象不可迭代 MySQL的主要内容,如果未能解决你的问题,请参考以下文章
TypeError: 'float' 类型的对象没有 len() & TypeError: 'float' 对象不可迭代
“TypeError:'StratifiedShuffleSplit'对象不可迭代”的原因可能是啥?