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:“通知”对象不可迭代

TypeError:'bool' 对象不可迭代

“TypeError:'StratifiedShuffleSplit'对象不可迭代”的原因可能是啥?

Python - TypeError:'int'对象不可迭代

“TypeError:'WebElement'对象不可迭代”错误代码python爬取