Django rest framework 在使用stream django和django rest框架进行扩展期间,如何序列化对象?
我在django REST框架中使用stream django,而强化活动在强化返回的对象上抛出“not JSON serializable”,这是意料之中的,因为它们没有经过任何序列化 如何自定义扩展过程,使其从drf序列化程序返回序列化对象,而不是对象本身 一些示例数据,未丰富: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", "
"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编写解决方案文档的人之一