【问题标题】: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