【问题标题】:Django REST framework getstream notificationsDjango REST 框架获取流通知
【发布时间】:2019-06-03 23:22:01
【问题描述】:

我正在尝试使用 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/ 时。如何编写一个端点来显示用户的通知?

views.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()

【问题讨论】:

    标签: django django-rest-framework getstream-io


    【解决方案1】:

    谢谢 JPG,你是对的。通过更多步骤,您甚至可以获得“丰富”的活动。 Harry Moreno,查看我在 github 上提供的示例:

    https://github.com/pterk/django_twitter/blob/master/stream_twitter/views.py#L141 复制到这里为您提供方便:

    class TimelineAPIView(APIView):
        """
        Timeline as an api view, enriched with local data
        """
        def get(self, request):
            feeds = feed_manager.get_news_feeds(self.request.user.id)
            activities = feeds.get('timeline').get()['results']
            enriched_activities = enricher.enrich_activities(activities)
            serializer = get_activity_serializer(enriched_activities, TweetSerializer, None, many=True)
            return Response(serializer.data)
    

    【讨论】:

    • 我无法将您的概念证明改编为通知提要。您能否尝试让我的存储库以最低限度的工作为通知提要提供动力?
    • 有几件事:您混合了新闻提要和通知提要,对象序列化程序需要 HyperLinkedIdentityFields 的上下文,加载固定装置不会触发与流同步(请参阅原始参数),最后但不是至少我的概念证明不适用于聚合/通知提要。我已经分叉了您的项目并推送了一个提交,当您通过管理员添加 sn-p 时会添加通知。见这里:github.com/GetStream/django-rest-framework-getstream
    【解决方案2】:

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

    因此,在 NotificationSerializer 的帮助下返回 Feed 实例的序列化版本,如下所示

    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)

    【讨论】:

    • 这会在return Response(serializer.data) 线上抛出错误'Feed' object is not iterable
    • 我需要在返回响应之前添加serializer.is_valid()。但是通知提要仍然是空的。如何让/notifications 返回一组 sn-p 通知?
    • 您的notification_feed 是空的吗?除此之外,如果您将 instance 传递给序列化程序,则无需调用 is_valid()
    • 你试过运行github.com/morenoh149/django-rest-framework-getstream 吗?就在那里
    • 我没有。因为您指定的错误与 Django 和 DRF 上下文更相关。
    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 2017-06-30
    • 2017-10-13
    • 2016-06-23
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    相关资源
    最近更新 更多