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