【问题标题】:Django Rest Framework - Envelope a Paginated ResponseDjango Rest Framework - 封装分页响应
【发布时间】:2020-03-18 16:09:59
【问题描述】:

我想将分页响应包装在信封中。结果应该是这样的。

{
    "data": ["datum 1", "datum 2", "datum 3"],
    "meta": {
        "some": "meta",
        "data": "foo",
    },
    "page": {
        "total": 12345,
        "count": 3,
        "from": 3,
        "to": 6,
        "next": "http://example.com?page=2",
        "prev": "http://example.com?page=0",
    }
}

可以通过继承PageNumberPagination来实现自定义页面格式。 我的问题是关于传递元数据。除了某种形式的带内信号外,我看不到任何将它传递给分页的方法。有没有更干净的方法来做到这一点?

【问题讨论】:

  • 需要传递什么样的元数据。我认为您可以在从 PageNumberPagination 继承时注入元数据,例如在他们的示例中,django-rest-framework.org/api-guide/pagination/#example
  • Api 的版本就是一个例子。另一个是交易ID。第一个可以静态嵌入,但第二个是问题。

标签: django django-rest-framework pagination metadata


【解决方案1】:
class CustomPagination(pagination.PageNumberPagination):
    view = None

    def paginate_queryset(self, queryset, request, view=None):
        self.view = view
        return super().paginate_queryset(queryset, request, view)

    def get_meta(self, data=None, **meta):
        return {
            'data_from_view': self.view.__class__.__name__,
            'static_data': settings.ROOT_URLCONF,
            'len_per_page': len(data),
            'dynamic_data_on_thy_fly': meta
        }

    def get_paginated_response(self, data, **meta):
        return Response({
            'links': {
                'next': self.get_next_link(),
                'previous': self.get_previous_link()
            },
            'meta': self.get_meta(data, **meta),
            'count': self.page.paginator.count,
            'results': data
        })

【讨论】:

  • 你应该重写相应视图的paginate_queryset(...)方法
猜你喜欢
  • 1970-01-01
  • 2016-09-14
  • 2021-10-11
  • 2013-04-09
  • 2018-03-24
  • 1970-01-01
  • 2017-04-09
  • 2015-10-22
  • 1970-01-01
相关资源
最近更新 更多