从Django Rest Framework和Datatables获取请求参数时出错

时间:2018-07-13 00:34:27

标签: django datatables django-rest-framework

我正在尝试使用DRF和数据表通过服务器端处理来填充具有大量数据的表。

以下是我的观点:

class ProductsListAPIView(LoginRequiredMixin, ListAPIView):
    authentication_classes = (authentication.SessionAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = ProductSerializer

    def get_queryset(self):
        qs = Product.objects.filter(user=self.request.user).order_by("-timestamp")
        return qs

    def list(self, request, *args, **kwargs):
        draw = int(self.request.GET["draw"])
        start = int(self.request.GET["start"])
        length = int(self.request.GET["length"])

        queryset = self.get_queryset()
        queryset = queryset[start:start+length]
        serializer = ProductSerializer(queryset, many=True)
        result = {"draw": draw,
                  "recordsTotal": queryset.count(),
                  "recordsFiltered":queryset.count(),
                  "data": serializer.data}
        return Response(result)

这是用于数据表和Ajax的脚本:

$(document).ready(function() {
     $('#exampleAjax2').dataTable( {
         "autoWidth": true,
         "displayLength": 10,
         "lengthChange": false,
         "ordering": false,
         "processing": true,
         "searching": false,
         "serverSide": true,
         "language": {
            "zeroRecords": "Nothing to display",
            "info": "Showing _START_ to _END_ of _TOTAL_ records",
            "infoEmpty": ""
        },
         "ajax": {
             "processing": true,
             "url": "/my-products/",
             "dataSrc": ""
         },
       "columns": [....],
     });
 });

我收到以下错误:KeyError: 'draw'

可能这意味着我没有使用正确的方法来获取参数。 虽然,这是我第一次尝试通过服务器端处理来处理DRF和数据表,所以可能还会出现其他错误。

2 个答案:

答案 0 :(得分:1)

应该是:

"url": "/my-products/?draw=0&start=0&length=0"

在Ajax和:

draw = int(self.request.GET.get("draw", 0))
start = int(self.request.GET.get("start", 0))
length = int(self.request.GET.get("length", 0))

在DRF中

答案 1 :(得分:1)

Python中的KeyError非常简单。在您的情况下,self.request.GET["draw"]语句尝试返回值drawdraw  在现有键集中找不到。

  

KeyError

     

在未找到映射(字典)键时引发   现有键集。

request.GET是类似于dict的对象,因此您可以使用.get()来访问值。

get()的语法为 get(key,[default]) 。 所以应该是

draw = int(self.request.GET.get("draw", default_val))
start = int(self.request.GET.get("start", default_val))
length = int(self.request.GET.get("length", default_val))

注意:如果您不提供 default_val ,则如果密钥不存在,.get()将返回None

您可以阅读有关KeyError in this SO post

的更多信息