2016-07-11 3 views
0

Так что у меня QuestionResource:TastyPie Сериализация во дигидрата

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'] 

Если URL-то вроде https://domain.com/api/v1/question/, он должен вернуться на вопросы с ответами атрибутов прилагается. Хотя они не сериализуются.

{ 
"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 
} 

Как сериализовать <Responses: Responses object>? Также, как мне сделать "responses" в массив json, а не строку?

EDIT: С помощью raphv, я использовал этот код в своих ресурсов:

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'] 

производить:

{ 
"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

закодированные JSON в Python всегда является строкой. Чтобы превратить его в * массив *, вам придется его декодировать. 'json.loads' делает это. – xyres

ответ

2

Вы должны создать отдельную ResponseResource и ссылку как в описание товара api.py.

Параметр full=True является то, что делает API возвращает полное представление каждого ответа

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

Спасибо, это сработало! – Tsangares

Смежные вопросы