Django rest framework 在使用stream django和django rest框架进行扩展期间,如何序列化对象?

Django rest framework 在使用stream django和django rest框架进行扩展期间,如何序列化对象?,django-rest-framework,getstream-io,Django Rest Framework,Getstream Io,我在django REST框架中使用stream django,而强化活动在强化返回的对象上抛出“not JSON serializable”,这是意料之中的,因为它们没有经过任何序列化 如何自定义扩展过程,使其从drf序列化程序返回序列化对象,而不是对象本身 一些示例数据,未丰富: "is_seen": false, "is_read": false, "group": "19931_2016-04-04", "created_at": "2016-04-04T08:53:42.601", "

我在django REST框架中使用stream django,而强化活动在强化返回的对象上抛出“not JSON serializable”,这是意料之中的,因为它们没有经过任何序列化

如何自定义扩展过程,使其从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)

充实步骤将字符串引用替换为完整的Django模型实例

例如:字符串“chat.Message:6”被替换为
chat.models.Message
(与
Message.objects.get(pk=6)
)的实例

默认情况下,DRF不知道如何序列化Django模型,并且由于序列化错误而失败。幸运的是,在使用DRF时,序列化模型是一项非常简单的任务。有一个特定于Django模型的内置序列化程序类(
serializers.ModelSerializer

DRF的文档在此详细解释了此过程:

在您的情况下,可能需要使用嵌套序列化,并使
对象
字段的序列化智能化(该字段可以包含对不同类型对象的引用)


Github上存在一个关于此的开放问题:。理想情况下,这是库作为助手/示例提供的内容,因此任何代码贡献/输入都将有助于实现这一点。

我通过执行以下操作解决了这一问题:

返回序列化程序类的模型上的属性标记

@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)

您是如何配置stream django的?我面临着一个艰难的时间配置它。你能帮我吗?你能分享更多关于你的序列化程序的信息吗?我尝试将
get\u serialized\u object\u或\u str
serialize\u activities
添加到我的视图中,结果发现错误
HyperlinkedEntityField需要序列化程序上下文中的请求。在实例化序列化程序时添加context={'request':request}。
@HarryMoreno很抱歉,我记不起实现了,我再也不能访问该源代码了。这是一个非常古老的问题,我相信今天有更好的方法来解决这个问题!你会感到惊讶的。我想我是为数不多的致力于为drf和getstream:p编写解决方案文档的人之一