TypeError:'method'对象不是可迭代的MySQL

时间:2016-04-22 07:23:45

标签: python mysql django django-rest-framework

当我尝试从TypeError表中获取数据并使用Django中的以下代码MySQL将其分配给queryset时,我得到ModelViewSet {/ 1}}

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()

它给了我以下错误

  

异常值:   'method'对象不可迭代

我做错了什么?有解决方案吗我有点像菜鸟,所以如果你能解释一下解决方案,那就太好了。

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

1 个答案:

答案 0 :(得分: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%的机器。您将无法获得连接池,事务管理,分页等。在这种情况下,只需使用正确的查询集和模型视图。