我正在尝试使用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和数据表,所以可能还会出现其他错误。
答案 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"]
语句尝试返回值draw
但draw
在现有键集中找不到。
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