2016-04-22 12 views
0

Ich erhalte eine TypeError wenn ich versuche, es zu bekommen Daten aus MySQL Tabelle und weisen auf eine queryset in Django folgenden Code ModelViewSetTypeerror: ‚Methode‘ Objekt nicht Iterable MySQL

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

Es gibt mir folgende Fehler

Exception Value: 'method' object is not iterable

Was mache ich falsch? Irgendwelche Lösungen? Ich bin eine Art Noob, also wenn Sie die Lösung auch erklären könnten, wäre das großartig.

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

Bitte fügen Sie die ** vollständige ** Traceback Ihrer Ausnahme, da nicht klar ist, woher dieser Fehler stammt. –

+0

@MartijnPieters Ich weiß nicht, wie Traceback einzuschließen, aber ich versuche .. –

+0

Ich sehe nicht, wo es passiert in dem Code, den Sie gebucht haben, aber da der Fehler ist '' Methode 'Objekt ist nicht iterable'' und Sie habe eine Methode namens '' queryset'' und eine lokale Variable namens '' querieset'' Ich vermute, dass sie irgendwo durcheinander geraten, aber ich sehe nicht wo. Versuchen Sie einen dieser Namen zu ändern und sehen Sie, ob sich etwas ändert. – nephlm

Antwort

1

Wenn Sie den Django REST Framework verwenden, dann werden Sie erwartet Modellinstanzen (Datenbank Ergebnisse) oder einfach Python Primitiven (integrierten Typen) zu erzeugen, und es wird darauf achten, von Serialisierung zu JSON für Sie. Durch das Abstrahieren der Serialisierung kann das Framework eine Inhaltsverhandlung implementieren, wobei der Client auswählen kann, in welchem ​​Format er die Daten empfängt. Das könnte JSON sein, aber es könnte auch etwas anderes sein. Ich vermute, dass das Zurückgeben einer JSON-Zeichenfolge die Annahmen, die das Framework macht, durcheinander bringt.

Bringen Sie Ihren Cursor Daten in einem rest_framework.response.Response Objekt stattdessen tun nicht serialize dies selbst:

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

Vom Responses section in the API Guide:

REST framework supports HTTP content negotiation by providing a Response class which allows you to return content that can be rendered into multiple content types, depending on the client request.

The Response class subclasses Django's SimpleTemplateResponse . Response objects are initialised with data, which should consist of native Python primitives. REST framework then uses standard HTTP content negotiation to determine how it should render the final response content.

Im obigen Beispiel auch contextlib.closing() ich verwendet, um sicherzustellen, Die Verbindung wird geschlossen, auch wenn es Ausnahmen in der Ansicht gibt, und dann die Verbindung als Kontextmanager verwendet, um den Cursor zu erstellen, und dann den Cursor zu ensu Auch es ist geschlossen.

Wenn Sie ein aktuelles Modell haben, verwenden Sie das Django ORM und erstellen Sie keine direkten Verbindungen. Sie benutzen eine große, gut integrierte Maschine und ignorieren hier 95% der Maschine. Sie werden nicht Verbindungspooling, Transaktionsverwaltung, Paginierung usw. usw. erhalten. Verwenden Sie in diesem Fall nur geeignete Abfragegruppen und Modellansichten.

+0

noch denselben Fehler .. –

+0

Ich bin wie diese cur.execute tun ("SELECT city_id, Stadt, country_id FROM Stadt") queryset = json.dumps (Liste (Aktuell)) –

+0

@NullPointer: Ja, das ist richtig. Bitte fügen Sie Ihrer Frage den vollständigen Traceback hinzu, denn wenn Sie diesen Fehler immer noch erhalten, dann ist * Ihr gebuchter Code nicht die Ursache *. –

Verwandte Themen