2016-04-05 1 views
3

django RESTフレームワークでstream-djangoを使用しており、豊富なアクティビティでは、エンリッチメントから返されたオブジェクトに「JSONではないシリアライズ可能」がスローされています。stream-djangoとdjango restフレームワークで豊富化中にオブジェクトをシリアル化するにはどうすればいいですか?

どのように私はdrfシリアライザからオブジェクト自体ではなくシリアル化されたオブジェクトを返すように濃縮プロセスをカスタマイズしますか?

いくつかの例のデータ、濃縮ない

"is_seen": false, 
"is_read": false, 
"group": "19931_2016-04-04", 
"created_at": "2016-04-04T08:53:42.601", 
"updated_at": "2016-04-04T11:33:26.140", 
"id": "0bc8c85a-fa59-11e5-8080-800005683205", 
"verb": "message", 
"activities": [ 
    { 
    "origin": null, 
    "verb": "message", 
    "time": "2016-04-04T11:33:26.140", 
    "id": "0bc8c85a-fa59-11e5-8080-800005683205", 
    "foreign_id": "chat.Message:6", 
    "target": null, 
    "to": [ 
    "notification:1" 
    ], 
"actor": "auth.User:1", 
"object": "chat.Message:6" 
} 

ビュー:

def get(self, request, format=None): 
    user = request.user 
    enricher = Enrich() 
    feed = feed_manager.get_notification_feed(user.id) 
    notifications = feed.get(limit=5)['results'] 
    enriched_activities=enricher.enrich_aggregated_activities(notifications) 
    return Response(enriched_activities) 

答えて

3

私は、次の手順を実行して、それを解決した:そして、シリアライザクラスに

@property 
def activity_object_serializer_class(self): 
    from .serializers import FooSerializer 
    return FooSerializer 

を返すモデルで

プロパティタグは、濃縮活動をシリアル化するために、これを使用していました。ネスティングをサポートします。

@staticmethod 
def get_serialized_object_or_str(obj): 
    if hasattr(obj, 'activity_object_serializer_class'): 
     obj = obj.activity_object_serializer_class(obj).data 
    else: 
     obj = str(obj) # Could also raise exception here 
    return obj 

def serialize_activities(self, activities): 
    for activity in activities: 
     for a in activity['activities']: 
      a['object'] = self.get_serialized_object_or_str(a['object']) 
      # The actor is always a auth.User in our case 
      a['actor'] = UserSerializer(a['actor']).data 
    return activities 

とビュー:

def get(self, request, format=None): 
    user = request.user 
    enricher = Enrich() 
    feed = feed_manager.get_notification_feed(user.id) 
    notifications = feed.get(limit=5)['results'] 
    enriched_activities = enricher.enrich_aggregated_activities(notifications) 
    serialized_activities = self.serialize_activities(enriched_activities) 
    return Response(serialized_activities) 
0

エンリッチステップは、完全なDjangoのモデルインスタンスに文字列参照を置き換えます。

たとえば、文字列「chat.Message:6」は、chat.models.MessageMessage.objects.get(pk=6)と同じ)のインスタンスに置き換えられます。

デフォルトでは、DRFはDjangoモデルをシリアル化する方法を知らず、シリアル化エラーで失敗します。 DRFを使用すると、幸いなことにモデルをシリアライズすることは非常に簡単な作業です。 Djangoモデル(serializers.ModelSerializer)に固有のビルトインシリアライザクラスがあります。

DRFのドキュメントでは、このプロセスについて詳しくは、http://www.django-rest-framework.org/api-guide/serializers/#modelserializerを説明しています。

場合によっては、ネストされたシリアライゼーションを使用し、objectフィールドのシリアル化を行う必要があります(このフィールドには、さまざまな種類のオブジェクトへの参照を含めることができます)。

Githubの公開されている問題はhttps://github.com/GetStream/stream-django/issues/38です。理想的には、これは図書館がヘルパー/例として提供するものなので、コード寄与/入力はそれを実現するのに役立ちます。

関連する問題