Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django REST框架:不同序列化对象的列表?_Django_Json_Serialization_Django Rest Framework - Fatal编程技术网

Django REST框架:不同序列化对象的列表?

Django REST框架:不同序列化对象的列表?,django,json,serialization,django-rest-framework,Django,Json,Serialization,Django Rest Framework,我有三种不同类型的对象:rawaarticle、RawPatent和RawGrant 我有很好的工作序列化程序,它的基类是序列化程序。ModelSerializer 如果检索到RawArticle的查询集,我可以使用many=True将其直接传递给序列化程序,并且输出为标称值: [{"save_link": "...", "published": "2014-01-18T20:39:54.086Z", }, {"save_link": "...", "published": "..."}, ..

我有三种不同类型的对象:
rawaarticle
RawPatent
RawGrant

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

日期时间对象不可序列化


任何提示都将不胜感激。

就我个人而言,为了处理序列化程序,我在模型中创建了一个
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))

即使对象不是模型,这种方法也应该有效。

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)

实际上,它返回一个字符串。在.data之后返回一个列表就成功了,我将在下面的回答中解释。这里缺乏良好的实践:将序列化登录与业务实体分离。我建议的方法是:
serialized=[RawArticleSerializer(article,many=False)。文章的数据是最新的]
并从
RawArticle
类中删除
serialize()
方法