Django REST framework получает уведомления об отправке - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь следовать документам gettream для django с остальными. https://github.com/GetStream/stream-django

Вот минимальный API DRF, клонированный из учебника DRF https://github.com/morenoh149/django-rest-framework-getstream

Я получаю ошибку

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

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Я не уверен насчет фрагмента кода внутри метода list(). Но я думаю, что вы возвращаете экземпляр модели Feed в класс Response, но DRF ожидает некоторые данные типа JSON.

Итак, верните сериализованную версию Feed экземпляров с помощью NotificationSerializer, как показано ниже

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>
0 голосов
/ 04 июня 2019

Спасибо, JPG, ты прав.С помощью еще нескольких шагов вы можете даже получить «обогащенную» деятельность.Гарри Морено, посмотрите пример, который я привел на 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)
...