您的位置:首页 > 编程语言 > Go语言

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接口已经实现,接下来实现前端渲染这些数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: