Django REST Framework:不同的serizalized对象列表?

时间:2014-01-20 13:27:19

标签: django json serialization django-rest-framework

我有三种不同类型的对象:RawArticleRawPatentRawGrant

我有很好的工作序列化程序,其基类为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说:

  

日期时间对象不可序列化。

任何提示都将不胜感激。

2 个答案:

答案 0 :(得分: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))

即使对象不是模型,这种方法仍然有用。

答案 1 :(得分:1)

Sunny的回答会将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)