Rub*_*idt 5 django-rest-framework getstream-io
我将stream-django与django REST框架一起使用,丰富的活动在从丰富返回的对象上抛出“不可JSON序列化”,这是预期的,因为它们没有经过任何序列化。
如何自定义丰富过程,以便它从我的 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"
}
Run Code Online (Sandbox Code Playgroud)
风景:
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)
Run Code Online (Sandbox Code Playgroud)
我通过执行以下操作解决了这个问题:
返回序列化器类的模型上的属性标记
@property
def activity_object_serializer_class(self):
from .serializers import FooSerializer
return FooSerializer
Run Code Online (Sandbox Code Playgroud)
然后用它来序列化丰富的活动。支持嵌套。
@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
Run Code Online (Sandbox Code Playgroud)
和视图:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |