2016-07-11 11 views
0

So habe ich eine QuestionResource:TastyPie Serialisieren während dehydrate

class QuestionResourse(ModelResource): 
def dehydrate(self, bundle): 
    bundle.data['responses'] = Responses.objects.filter(question_id=bundle.data['id']) 
    return bundle 
class Meta: 
    resource_name='question' 
    queryset = Questions.objects.all() 
    allowed_methods = ['get', 'post'] 

Wenn die URL so etwas wie https://domain.com/api/v1/question/ ist, sollte er die Fragen mit den Attribut Antworten angebracht zurückzukehren. Obwohl sie nicht serialisiert werden.

{ 
"date": "2015-10-03T16:53:22", 
"id": "1", 
"question": "Where is my mind?", 
"resource_uri": "/api/v1/question/1/", 
"responses": "[<Responses: Responses object>, <Responses: Responses object>, <Responses: Responses object>, <Responses: Responses object>, <Responses: Responses object>]", 
"totalresponses": 5 
} 

Wie kann ich die <Responses: Responses object> serialisieren? Auch, wie mache ich "responses" in ein JSON-Array und keine Zeichenfolge?

EDIT: Mit Hilfe raphv, habe ich diesen Code in meinen Ressourcen:

class ResponseResourse(ModelResource): 
    class Meta: 
     resource_name='response' 
     queryset = Responses.objects.all() 
     allowed_methods = ['get', 'post'] 
class QuestionResourse(ModelResource): 
    responses = fields.ToManyField(ResponseResourse, attribute=lambda bundle: Responses.objects.filter(question_id = bundle.obj.id), full=True) 
    class Meta: 
     resource_name='question' 
     queryset = Questions.objects.all() 
     allowed_methods = ['get', 'post'] 

zu produzieren:

{ 
"date": "2015-10-03T16:53:22", 
"id": "1", 
"question": "Where is my mind?", 
"resource_uri": "/api/v1/question/1/", 
"responses": [ 
    { 
     "id": "54", 
     "resource_uri": "/api/v1/response/54/", 
     "response": "ooooooo oooooo", 
    }, 
    { 
     "id": "60", 
     "resource_uri": "/api/v1/response/60/", 
     "response": "uhh, test", 
     "votes": 0 
    }] 
} 
+0

Encoded JSON in Python eine vollständige Darstellung jeder Antwort zurück ist immer ein String. Um es in ein * Array * zu verwandeln, müssen Sie es entschlüsseln. 'json.loads' macht das. – xyres

Antwort

2

Sie sollten ein separates ResponseResource und Link erstellen sowohl in api.py.

Der full=True Parameter ist, was die API macht

from tastypie import resources, fields 

class ResponseResource(resources.ModelResource): 
    class Meta: 
     resource_name = 'response' 
     queryset = Responses.objects.all() 
     ... 

class QuestionResource(resources.ModelResource): 
    responses = fields.ToManyField(ResponseResource, 'responses', full=True) 
    class Meta: 
     resource_name='question' 
     queryset = Questions.objects.all() 
     ... 
+0

Danke, das hat funktioniert! – Tsangares

Verwandte Themen