以之前车辆违章项目来做
修改urls.pypath(\'api/\',api) #返回json收据的url在views.py中添加函数def api(request:HttpRequest) -> HttpResponse:queryset = Record.objects.filter(is_deleted=False)\\.dafer(\'is_deleted\',\'deleted_time\',\'updated_time\')\\.select_related(\'car\').order_by(\'-makedate\')carinfo = request.POST.get(\'carinfo\')if carinfo:carinfo = re.sub(r\'\\s\',\'\',carinfo)queryset = queryset.filter(Q(car__carno__istartswith=carinfo) | Q(car__owner__icontains=carinfo))records = []for record in queryset:data = {\'no\':record.no,\'carno\':record.car.carno,\'owne\':record.car.owner,\'reason\':record.reason,\'makedate\':record.makedate,\'punish\':record.punish,\'dealt\':record.dealt}records.append(data)return JsonResponse(records,safe=False)#请求api可以返回一串数组#上面的代码中,我们通过循环遍历查询违章得到的 QuerySet 对象,将每个违章的数据处理成一个字典,在将字典保存在名为 subjects 的列表容器中,最后利用 JsonResponse 完成对列表的序列化,向浏览器返回JSON格式的数据。由于 JsonResponse 序列化的是一个列表而不是字典,所以需要指定 safe参数的值为 False 才能完成对 subjects 的序列化,否则会产生 TypeError 异常。
利用Django第三方库djangorestframework来实现序列化
安装依赖pip install djangorestframework在settings.py中修改代码INSTALLED_APPS = [...,\'restframework\',]在应用下新建一个py文件(本项目在search下)新建py文件名称为 serializers.py进入serializers.py中\"\"\"自定义序列化器(把模型对象处理成字典)\"\"\"from rest_framework import serializersfrom search.models import Recordclass RecordSerializer(serializers.ModelSerializer):class Meta:model = Record #要序列化的对象fields = \'__all__\' #__all__ 序列化所有修改views.py函数def records_api(request):queryset = Record.objects.filter(is_deleted=False) \\.defer(\'is_deleted\', \'updated_time\', \'deleted_time\') \\.select_related(\'car\').order_by(\'-no\')carinfo = request.POST.get(\'carinfo\',\'\')if carinfo:info = re.sub(r\'\\s\',\'\',carinfo)queryset = queryset.filter(Q(car__carno__istartswith=carinfo) | Q(car__owner__icontains=carinfo))resi = RecordSerializer(queryset,many=True) #这里返回一个列表return JsonResponse({\'records\':resi.data}) #这种形式直接返回字典 不用加safe=False#(resi.data,safe=False) 如果返回列表 必须加上safe=False#最好给字典格式的用Resonpon返回数据接口from rest_framework.decorators import api_viewfrom rest_framework.response import Response@api_view((\'GET\',)) #如果用Resonpon返回必须用这个装饰器,(\'GET\'表示只接受get请求,是一个元祖)def records_api(request):queryset = Record.objects.filter(is_deleted=False) \\.defer(\'is_deleted\', \'updated_time\', \'deleted_time\') \\.select_related(\'car\').order_by(\'-no\')carinfo = request.POST.get(\'carinfo\',\'\')if carinfo:info = re.sub(r\'\\s\',\'\',carinfo)queryset = queryset.filter(Q(car__carno__istartswith=carinfo) | Q(car__owner__icontains=carinfo))resi = RecordSerializer(queryset,many=True)return Response({\'record\':resi.data}) #返回的是一个字典,也可以返回一个列表(resi.data)#请求这个函数则返回drm自带的渲染页面,#这里存在1+N查询问题,下面代码优化了这个问题优化查询时间,在serializers.py中修改要序列化的字段class RecordSerializer(serializers.ModelSerializer):class Meta:model = Record#fields = \'__all__\' #序列化全部模型fields = (\'no\',\'reason\',\'punish\',\'makedate\',\'dealt\',\'car\') #需要哪些字段#exclude = (\'is_deleted\',\'updated_time\',\'deleted_time\') #排除这几个字段#这两者必须有一个,否则会报错数据中外键字段显示的外键主键,我们想要的是外键字段中的数据,而不是关联对象from rest_framework import serializersfrom serach.models import Record, Carclass CarSerializer(serializers.ModelSerializer):\'\'\'车序列化器\'\'\'class Meta:model = Carfields = (\'carno\',\'owner\')class RecordSerializer(serializers.ModelSerializer):\'\'\'违章记录序列化器\'\'\'car = serializers.SerializerMethodField()def get_car(self,record):return CarSerializer(record.car).data#return {\'carno\':record.car.carno,\'owner\':record.car.owner}#直接返回字典的话,不需要上面的那个类,但是比较繁琐不推荐class Meta:model = Record#fields = \'__all__\' #序列化全部模型#fields = (\'no\',\'reason\',\'punish\',\'makedate\',\'dealt\',\'car\') #需要哪些字段exclude = (\'is_deleted\',\'updated_time\',\'deleted_time\') #排除这几个字段#这两者必须有一个,否则会报错#现在为止这个api接口已经实现,接下来实现前端渲染这些数据