0

Ich benutze Django Rest Framework in meiner Anwendung.In Sicht für get Abfrage, ich bekomme eine Liste von Modellen in Form von Queryset und versuchen, an meine Antwort()Django Rest Framework: passing queryset zu Response()

übergeben

organizationViews.py

def get(self,request): 
    user = self.request.user 
    result = OrganizationModel.object.all() 
    serializer = OrganizationSerializer("json", list(result), many=True) 
    return Response(serializer, status=status.HTTP_200_OK) 

organizationModel.py

class OrganizationManager(models.Manager): 
    def create_organization(self, _name): 
     org = self.model(name = _name) 
     org.save(using=self._db) 
     return org 


class Organization(BaseModel): 
    name = models.CharField(_('organization'), max_length=100,  blank=True,unique=True) 

def as_json(self): 
    return dict(
     id=self.id, 
     org_name=self.name) 

object = OrganizationManager() 

class Meta(BaseModel.Meta): 
    db_table = 'organizations' 
    verbose_name = _('organization') 
    verbose_name_plural = _('organizations') 

def __str__(self): 
    return self.name 

ich erhalte folgende Fehlermeldung:

Traceback (most recent call last): 
File "/Users/richagupta/VirtualEnvs/py35/lib/python3.5/site-packages/django/core/handlers/base.py", line 174, in get_response 
response = self.process_exception_by_middleware(e, request) 
    File "/Users/richagupta/VirtualEnvs/py35/lib/python3.5/site-packages/django/core/handlers/base.py", line 172, in get_response 
response = response.render() 
    File "/Users/richagupta/VirtualEnvs/py35/lib/python3.5/site-packages/django/template/response.py", line 160, in render 
self.content = self.rendered_content 
File "/Users/richagupta/VirtualEnvs/py35/lib/python3.5/site-packages/rest_framework/response.py", line 71, in rendered_content 
ret = renderer.render(self.data, media_type, context) 
File "/Users/richagupta/VirtualEnvs/py35/lib/python3.5/site-packages/rest_framework/renderers.py", line 104, in render 
separators=separators 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 237, in dumps 
**kw).encode(obj) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 199, in encode 
chunks = self.iterencode(o, _one_shot=True) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 257, in iterencode 
return _iterencode(o, 0) 
File "/Users/richagupta/VirtualEnvs/py35/lib/python3.5/site-packages/rest_framework/utils/encoders.py", line 64, in default 
return super(JSONEncoder, self).default(obj) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 180, in default 
raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: OrganizationSerializer('json', [<Organization: zeotap>, <Organization: movial>, <Organization: Redbull>, <Organization: mogey>, <Organization: vizury>], many=True): 
id = IntegerField() 
name = CharField() is not JSON serializable 

Wenn ich folgendes in get Aufruf:

serialized_q= json.dumps(list(queryset), cls=DjangoJSONEncoder) 
return Response(serialized_q, status=status.HTTP_200_OK) 

ich den Fehler nicht, aber Ergebnis ist so etwas wie folgt vor:

"[{\"id\": 1, \"soft_delete\": false, \"created_at\": \"2016-04-14T13:35:21.636Z\", \"name\": \"org1\", \"updated_at\": \"2016-04-14T13:35:21.636Z\"}, 
    {\"id\": 4, \"soft_delete\": false, \"created_at\": \"2016-04-14T13:37:02.230Z\", \"name\": \"org2\", \"updated_at\": \"2016-04-14T13:37:02.230Z\"}]" 

Wie soll ich queryset auf Antwort-Methode übergeben ?

Antwort

1

Sie haben nicht wirklich die get-Methode außer Kraft setzen möchten, können Sie wäre wahrscheinlich besser, überschreiben get_queryset;

Sie können hier einfach einen Suchanfragensatz zurückgeben, Django serialisiert ihn für Sie. Sie haben Zugriff auf die Anfrage über self.request.

+1

Ja, es hat funktioniert. –

0

Ich denke, Sie können nur einen Serializer verwenden, um ein einzelnes Modell zu serialisieren. Also statt:

serializer = OrganizationSerializer("json", list(result), many=True) 

Versuchen:

data = [ 
    OrganizationSerializer(model).data 
    for model in result 
] 

Dann einfach:

return Response(data) 

See: http://www.django-rest-framework.org/api-guide/serializers/#serializing-objects

+0

Das funktioniert nicht –

+0

Sorry, versuchen Sie es stattdessen – SpoonMeiser

+0

Das geben immer noch Folgendes: "[{\ ID: 1, \" soft_delete \ ": false, \" created_at \ ": \" 2016-04 -14T13: 35: 21.636Z \ ", \" Name \ ": \" org1 \ ", \" aktualisiert \ ": \" 2016-04-14T13: 35: 21.636Z \ "}, {\" ID \ ": 4, \" soft_delete \ ": false, \" created_at \ ": \" 2016-04-14T13: 37: 02.230Z \ ", \" name \ ": \" org2 \ ", \" updated_at \ " : \ "2016-04-14T13: 37: 02.230Z \"}] " –

Verwandte Themen