2014-01-20 3 views
2

У меня есть три разных типа объектов: RawArticle, RawPatent и RawGrant.Django REST Framework: список различных сериализованных объектов?

У меня есть большие рабочие сериализаторы, базовый класс которых serializers.ModelSerializer.

Если я получить набор запросов из RawArticle я могу передать, что непосредственно к сериализатору с many=True и выход номинальный:

[{"save_link": "...", "published": "2014-01-18T20:39:54.086Z", }, {"save_link": "...", "published": "..."}, ...] 

Этот ответ генерируется из следующего кода:

return Response(RawArticleSerializer(articles, many=True).data) 

Теперь, когда у меня есть три разных объекта, я хотел бы связать их так же, как и выше, но с их соответствующими объектами.

Я до сих пор не увенчался успехом. Моя первоначальная идея состояла в том, чтобы просто создать список сериализованными объектов и вернуть, что (сериализовать конечно), как таковой:

all_latest = user_latest(request)['latest_articles'] 

    available_serializers = {RawArticle: RawArticleSerializer, RawGrant: RawGrantSerializer, RawPatent: RawPatentSerializer} 
    serialized = [] 
    for article in all_latest: 
     serialized.append((available_serializers[type(article)](article, many=False)).data) 

    return Response(str(serialized)) 

Приведенный выше код не возвращает JSON и времени и даты, не преобразуются в фактической даты и время как строка.

Моя последняя попытка с помощью json.dumps и simplejson и оба поднимают TypeError говоря:

дата объекта время не сериализации.

Подсказка была бы принята с благодарностью.

ответ

1

Ответ Солнечной будет возвращать JSON в виде строки (в окружении двойных кавычек). Во избежание этого, возвращение списка делает то, что мне нужно:

serialized = [] 
    AVAILABLE_SERIALIZERS = {RawArticle: RawArticleSerializer, RawGrant: RawGrantSerializer, RawPatent: RawPatentSerializer} 
    for article in articles: 
     serialized.append((AVAILABLE_SERIALIZERS[type(article)](article, many=False)).data) 

    return Response(serialized) 
2

Лично для работы с сериализаторами я создаю метод serialize в своих моделях. Этот метод, в свою очередь, вызывает соответствующий код для сериализации данных.

В этом случае код будет выглядеть так:

class RawArticle(models.Model): 
    def serialize(self): 
     return RawArticleSerializer(self, many=False).data 

Затем в основной код:

from rest_framework.renderers import JSONRenderer 

all_latest = user_latest(request)['latest_articles'] 

serialized = [article.serialize() for article in all_latest] 
return Response(JSONRenderer().render(serialized)) 

Даже если объекты не модели, этот подход должен работать.

+0

Большое спасибо! JSONRendered сделал трюк. – ChrisR

+0

Фактически это возвращает строку. Возврат списка после .data сделал трюк, как я объясню в своем ответе ниже. – ChrisR

+0

Отсутствие хорошей практики здесь: разделить логику ввода-вывода от бизнес-единиц. Я предложил подход с просто: 'serialized = [RawArticleSerializer (статья, много = False) .data для статьи в all_latest]' и удалить метод serialize() из класса 'RawArticle' – Rafa0809

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