使用Django REST Framework+Datatables实现表格搜索时遇序列化错误
Datatable搜索功能异常问题
已成功展示Datatable,但表格搜索功能出现异常,以下是相关代码及报错信息:
models.py
class Sites(models.Model): site_id = models.IntegerField(primary_key=True) site_name = models.CharField(max_length=20) site_description = models.TextField() class Meta: managed = False db_table = 'sites'
views.py
class SitesViewSet(viewsets.ModelViewSet): queryset = Sites.objects.all() serializer_class = SitesViewSerializer def list(self, request, **kwargs): try: query = query_sites_by_args(**request.query_params) serializer = SitesViewSerializer(query['items'], many=True) result = dict() result['data'] = serializer.data result['draw'] = query['draw'] result['recordsTotal'] = query['total'] result['recordsFiltered'] = query['count'] return Response(result, status=status.HTTP_200_OK, template_name=None, content_type=None) except Exception as e: return Response(e, status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None)
serializers.py
class SitesViewSerializer(serializers.ModelSerializer): class Meta: model = Sites fields = ('site_id', 'site_name', 'site_description')
JavaScript代码
$(document).ready(function() { let table = $('#datatables').DataTable({ search:{ }, lengthMenu: [[25, 50, 100, -1], [25, 50, 100, "All"]], responsive: true, processing: true, serverSide: true, bSearchable: true, ajax: { url: "/api/sites/", type: "GET" }, columns: [ {"data": "site_id"}, {"data": "site_name"}, {"data": "site_description"}, // {"data": "link"}, { "data": null, "defaultContent": '<button type="button" class="btn btn-success">View Participants</button>' } ], } ); // on button click $('#datatables tbody').on('click', 'button', function (x) { let url; let data = table.row($(this).parents('tr')).data(); let class_name = $(this).attr('class'); if (class_name === 'btn btn-success') { // assign the full s3 path of the file to filename let sitename = data['site_name']; url = 'site' + "/" + sitename; location.href = url; } }); } );
报错信息
Internal Server Error: /api/sites/ Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner response = get_response(request) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/handlers/base.py", line 202, in _get_response response = response.render() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/template/response.py", line 105, in render self.content = self.rendered_content File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/response.py", line 70, in rendered_content ret = renderer.render(self.data, accepted_media_type, context) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/renderers.py", line 99, in render ret = json.dumps( File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/utils/json.py", line 25, in dumps return json.dumps(*args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/__init__.py", line 238, in dumps **kw).encode(obj) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/encoder.py", line 199, in encode chunks = self.iterencode(o, _one_shot=True) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/encoder.py", line 257, in iterencode return _iterencode(o, 0) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/utils/encoders.py", line 67, in default return super().default(obj) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/encoder.py", line 179, in default raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type FieldError is not JSON serializable [03/May/2023 22:46:49] "GET /api/sites/?draw=3&columns%5B0%5D%5Bdata%5D=site_id&columns%5B0%5D%5Bname%5D=&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=true&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=site_name&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=true&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=site_description&columns%5B2%5D%5Bname%5D=&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=true&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B3%5D%5Bdata%5D=&columns%5B3%5D%5Bname%5D=&columns%5B3%5D%5Bsearchable%5D=true&columns%5B3%5D%5Borderable%5D=true&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=false&order%5B0%5D%5Bcolumn%5D=0&order%5B0%5D%5Bdir%5D=asc&start=0&length=25&search%5Bvalue%5D=yay&search%5Bregex%5D=false&_=1683154006765 HTTP/1.1" 500 110334
推测
搜索功能异常可能是请求格式不正确导致了该TypeError。
内容的提问来源于stack exchange,提问作者matthew
相关产品推荐
相关产品推荐

