【问题标题】:Django Viewset Pagination throws serialization errorDjango Viewset Pagination 抛出序列化错误
【发布时间】:2018-03-23 10:12:50
【问题描述】:

我有这样的事情:

分页视图集:

class FeedViewSet(ModelViewSet):

    queryset = Feed.objects.all()
    serializer_class = FeedSerializer

    def list(self, request, *args, **kwargs):

        paginator = pagination.LimitOffsetPagination()
        paginator.default_limit = 15
        paginator.limit = paginator.get_limit(request)
        paginator.offset = paginator.get_offset(request)
        feeds = paginator.paginate_queryset(Feed.objects.all(), request)
        return Response(
                data={
                        'feeds': feeds,
                        'limit': paginator.limit,
                        'offset': paginator.offset,
                        'overall_count': paginator.count
                    }
                )

Feed 模型:

class Feed(Base):
    headline = models.CharField(max_length=255)
    link = models.CharField(max_length=255, unique=True)
    summary = models.TextField()
    published_date = models.DateTimeField()
    views = models.IntegerField(default=0)
    shares = models.IntegerField(default=0)
    source = models.ForeignKey(Source, on_delete=models.CASCADE, )
    reader = models.ManyToManyField(User, through='Bookmark')

Feed 序列化器:

class FeedSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'headline',
            'link',
            'summary',
            'published_date',
            'views',
            'shares',
            'source',
            'created',
            'modified',

        )
        model = models.Feed

我是 Django 新手。我在这里可能完全错了。

我在这里查看了官方 DRF:http://www.django-rest-framework.org,但无法找出实现分页的正确方法。

我得到这样的东西:TypeError: Object of type 'Feed' is not JSON serializable

我做错了什么?如果这不是正确的方法,应该如何做。 我需要进行哪些更改?

【问题讨论】:

    标签: django pagination django-queryset django-pagination django-rest-viewsets


    【解决方案1】:

    您应该传递给Response 序列化的提要数据。为此,您需要使用序列化程序:

    def list(self, request, *args, **kwargs):
        serializer = self.get_serializer_class()
        paginator = pagination.LimitOffsetPagination()
        paginator.default_limit = 15
        paginator.limit = paginator.get_limit(request)
        paginator.offset = paginator.get_offset(request)
        feeds = paginator.paginate_queryset(Feed.objects.all(), request)
        return Response(
                data={
                        'feeds': serializer(feeds, many=True).data,
                        'limit': paginator.limit,
                        'offset': paginator.offset,
                        'overall_count': paginator.count
                    }
                )
    

    【讨论】:

    • 执行此操作后出现此错误:Object of type 'ListSerializer' is not JSON serializable
    • @WaqasHamid 我已经更新了答案。应该是serializer(feeds, many=True).data。
    • 谢谢!这行得通。您能告诉我如何在数据中提供next 和previous,以便导航到更多结果吗?
    • @WaqasHamid 尝试使用paginator.get_next_link() 和paginator.get_previous_link()。
    • 你能支持这个问题吗?我认为它应该适用于像我这样在开始使用 Django 时绝对感到迷茫的初学者。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    相关资源
    最近更新 更多