Django实现前后端分离开发
2020-07-30 17:18
791 查看
以之前车辆违章项目来做
修改urls.py path('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 serializers from search.models import Record class 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_view from 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 serializers from serach.models import Record, Car class CarSerializer(serializers.ModelSerializer): '''车序列化器''' class Meta: model = Car fields = ('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接口已经实现,接下来实现前端渲染这些数据
相关文章推荐
- django集成vue,实现前后端分离开发
- django与vue的完美结合_实现前后端的分离开发之后在整合的方法
- ASP.NET Core模块化前后端分离快速开发框架介绍之4、模块化实现思路
- Python前后端分离开发Vue+Django REST framework RESTFul Api跨域电商实战分享
- Python前后端分离开发Vue+Django REST framework实战
- Webpack + Tomcat + Nginx/Apache实现前后端开发分离
- vue+mockjs模拟数据实现前后端分离开发的实例代码
- django框架前后端分离CBV模式后端API开发
- Python Django+Vue前后端分离开发
- puer实现前后端分离开发
- djangorestframework实现前后端分离
- 如何实现前后端分离开发
- Python Django+Vue前后端分离开发
- python3 + django1.11.8 +mysql5.5 +ubuntu19.04 +vim前后端分离开发后端‘注册’‘登陆’代码
- webpack实现前后端分离开发
- 如何在Vue项目中使用Mockjs,模拟接口返回的数据,实现前后端分离独立开发
- Django +vue.js实现前后端分离(十三)
- Python前后端分离开发Vue+Django REST framework RESTFul Api跨域电商实战视频教程
- 前后端分离(django+vue)实现分页器
- Django rest+Vue前后端分离开发(一)项目初始化