【问题标题】:React-admin turning off reliance on X-Total-CountReact-admin 关闭对 X-Total-Count 的依赖
【发布时间】:2019-10-18 08:56:17
【问题描述】:

我希望 React-admin 能够使用 Django Rest Framework 来解决问题,就像它的网站所暗示的那样,但我的经验是它没有。尝试设置自定义标头以适应 react-admins 对每个响应的 X-Total-Count 标头的要求是一项耗时的任务。 Django Rest Framework 似乎更喜欢将计数放入 json 响应中。

有谁知道如何从 json 中读取这些信息?在我看来,在 react admin 中设置一个选项而不是用 Django 或其他 rest 框架重写中间件似乎是合乎逻辑的。

【问题讨论】:

  • 使用自定义数据提供程序非常简单(无论如何您最终都可能需要它)。同时,您可以使用decorator 包装您当前使用的提供程序,该decorator 只是将响应中的计数复制到返回的total

标签: django reactjs react-admin


【解决方案1】:

这是一个使用基于类的视图的解决方案示例。

views.py 示例:

from .models import AzureADList
from rest_framework import pagination
from rest_framework.response import Response
from .serializers import AzureADListSerializer
from rest_framework import generics


def _positive_int(integer_string, strict=False, cutoff=None):
    """
    Cast a string to a strictly positive integer.
    """
    ret = int(integer_string)
    if ret < 0 or (ret == 0 and strict):
        raise ValueError()
    if cutoff:
        return min(ret, cutoff)
    return ret

class StandardResultsSetPagination(pagination.LimitOffsetPagination):
    '''This is to handle react-admins call to our API when paginating'''
    offset_query_param = '_start'

    def get_paginated_response(self, data):
        headers={'X-Total-Count': self.count}
        response = Response(data, headers=headers)
        return response

    def get_limit(self, request):

        print('request query params..')
        print(request.query_params)
        try:
            end = request.query_params['_end']
            start = request.query_params['_start']
            limit = int(end) - int(start)
            return _positive_int(limit)

        except (KeyError, ValueError):
            pass

        return self.default_limit

class UserViewSet(generics.ListCreateAPIView):
    queryset = AzureADList.objects.all()
    serializer_class = AzureADListSerializer
    pagination_class = StandardResultsSetPagination

    def get(self, request, *args, **kwargs):
        queryset = self.get_queryset()
        page = self.paginate_queryset(queryset)
        serializer = self.get_serializer(page, many=True)
        response = self.get_paginated_response(serializer.data)
        return response

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 2021-07-04
    • 2019-12-14
    • 2018-02-17
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2021-09-24
    相关资源
    最近更新 更多