我有三种不同类型的对象:RawArticle
,RawPatent
和RawGrant
。
我有很好的工作序列化程序,其基类为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
说:
日期时间对象不可序列化。
任何提示都将不胜感激。
答案 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)