Django REST 框架获取流通知
Django REST framework getstream notifications
我正在尝试使用 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)
serializers.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()
我不确定 list()
方法中的代码片段。但是,我认为您正在 return 将 Feed
模型实例 Response
class,但 DRF 需要一些 JSON 类型的数据。
因此,return Feed
实例的序列化版本 在 [=14= 的帮助下]如下
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)
<b>serializer = NotificationSerializer(notification_feed)
<strike>serializer.is_valid()</strike> # this has no effect in your code
return Response(serializer.data)</b>
谢谢 JPG,您是对的。通过更多的步骤,您甚至可以获得 'enriched' 个活动。 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)
我正在尝试使用 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)
serializers.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()
我不确定 list()
方法中的代码片段。但是,我认为您正在 return 将 Feed
模型实例 Response
class,但 DRF 需要一些 JSON 类型的数据。
因此,return Feed
实例的序列化版本 在 [=14= 的帮助下]如下
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)
<b>serializer = NotificationSerializer(notification_feed)
<strike>serializer.is_valid()</strike> # this has no effect in your code
return Response(serializer.data)</b>
谢谢 JPG,您是对的。通过更多的步骤,您甚至可以获得 'enriched' 个活动。 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)