2014-01-20 28 views
2

我有三種不同類型的對象:RawArticle,RawPatentRawGrantDjango REST框架:不同的seizalized對象列表?

我有很棒的工作序列化器,它的基類是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

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) 
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(article,many = False).data for article in all_latest]'並從'RawArticle'類中移除'serialize()'方法 – Rafa0809

相關問題