首页 > 解决方案 > Django REST 框架获取流通知

问题描述

我正在尝试使用 rest 框架遵循 django 的 getstream 文档。https://github.com/GetStream/stream-django

这是从 drf 教程https://github.com/morenoh149/django-rest-framework-getstream克隆的最小 drf api

我收到一个错误

TypeError at /notifications/
Object of type Feed is not JSON serializable

/notifications/在浏览器中打开时。如何编写端点来显示用户的通知?

视图.py

class NotificationViewSet(viewsets.ViewSet):
"""
This viewset returns a notifications feed for the logged in user.
The feed contains events for when a relevant snippet is created.
"""
serializer_class = NotificationSerializer

def list(self, request):
    user_id = request.user.id
    notification_feed = feed_manager.get_notification_feed(user_id)
    return Response(notification_feed)

序列化程序.py

class ActivitySerializer(serializers.Serializer):
    id = serializers.UUIDField()
    foreign_id = serializers.CharField()
    verb = serializers.CharField()
    time = serializers.DateTimeField()

    def __init__(self, *args, **kwargs):
        object_serializer = kwargs.pop("object_serializer", None)
        actor_serializer = kwargs.pop("actor_serializer", None)
        super().__init__(self, *args, **kwargs)
        if object_serializer:
            self.fields["object"] = object_serializer()
        else:
            self.fields["object"] = serializers.CharField()
        if actor_serializer:
            self.fields["actor"] = actor_serializer()
        else:
            self.fields["actor"] = serializers.CharField()


class AggregatedSerializer(ActivitySerializer):
    group = serializers.CharField()
    activities = ActivitySerializer(many=True)


class NotificationSerializer(AggregatedSerializer):
    is_seen = serializers.BooleanField()
    is_read = serializers.BooleanField()

标签: djangodjango-rest-frameworkgetstream-io

解决方案


我不确定list()方法中的代码片段。但是,我认为您正在将Feed模型实例返回给Response类,但 DRF 需要一些 JSON 类型的数据。

因此,在下面的帮助下返回实例的序列化版本FeedNotificationSerializer

class NotificationViewSet(viewsets.ViewSet):
    """
    This viewset returns a notifications feed for the logged in user.
    The feed contains events for when a relevant snippet is created.
    """
    serializer_class = NotificationSerializer

    def list(self, request):
        user_id = request.user.id
        notification_feed = feed_manager.get_notification_feed(user_id)
        serializer = NotificationSerializer(notification_feed)
        serializer.is_valid() # this has no effect in your code
        return Response(serializer.data)

推荐阅读