学到这里,我们了解了Django的基本使用和数据的操作,下面是我针对接口数据的增删改查需求使用2种不同的写法:
写法一:
子应用路由表 urls.py
urlpatterns = [ # path('admin/', admin.site.urls), path('index1/', index1), path('index1/', views.index1), re_path('^index2/$', index2), #类视图路由的定义,views.类视图.as_view(),as_view必须要加括号,不然后面运行会有报错 path('index4/',views.MyView.as_view()), # 冒号前面:内置转化器(int、slug、uuid等) # 冒号后面:路径参数名 path('index4/<int:pk>/',views.MyView.as_view()) ]
模型类 models.py
class ProjectsModel(BaseModel): # 设置id为主键 id = models.AutoField(primary_key=True, verbose_name="id主键", help_text="id主键") name=models.CharField(unique=True,max_length=200,verbose_name="项目名",help_text="项目名") leader=models.CharField(max_length=20,verbose_name="负责人",help_text="负责人") tester=models.CharField(max_length=20,verbose_name="测试负责人",help_text="测试负责人") programmer=models.CharField(max_length=50,verbose_name="开发人员",help_text="开发人员") publish_app=models.CharField(max_length=100,verbose_name="发布应用",help_text="发布应用") desc=models.TextField(max_length=200,verbose_name="简要描述",help_text="简要描述",blank=True,null=True,default="") class Meta: db_table = 'tb_projects' verbose_name = '项目信息' verbose_name_plural = verbose_name def __str__(self): return self.name
视图集 views.py
在设计接口时候,根据数据的增删改查不同的操作映射不同的请求方式:
新增数据------->post请求,入参为json格式数据
删除数据------->delete请求,入参为项目id
修改数据------->put请求,可以传id和要更新的属性值
查询所有数据------->get请求
查询指定id的数据------->get请求
class MyView(View): def get(self, request, pk=None): # 查询数据 # data=ProjectsModel.objects.get(id=1) if pk != None: data_query = ProjectsModel.objects.get(pk=pk) # data_query=dict(data_query) data_list = [] data_dic = { "id": data_query.id, "project_name": data_query.name, "tester": data_query.tester, "leader": data_query.leader, "publish_app": data_query.publish_app } data_list.append(data_dic) data_str = json.dumps(data_list, ensure_ascii=False) return HttpResponse(data_str, content_type="application/json") else: data_query = ProjectsModel.objects.all() data_list = [] for obj in data_query: data_dic = { "id": obj.id, "name": obj.name, "tester": obj.tester } data_list.append(data_dic) # data_query=list(data_query) data_str = json.dumps(data_list, ensure_ascii=False) return HttpResponse(data_str, content_type="application/json") # data=ProjectsModel.objects.filter(id__gte=2) # return JsonResponse(data_query, safe=False) # data_qs=ProjectsModel.objects.filter(name__contains="项目").exclude(desc__startswith="1没有") # data_qs=ProjectsModel.objects.filter(Q(name__contains="项目")|Q(desc__startswith="1没有")) # data_qs=ProjectsModel.objects.filter(interfacesmodel__tester="测试人1") # data_qs=ProjectsModel.objects.filter(interfacesmodel__tester__endswith="1") # data_qs = InterfacesModel.objects.filter(project__name__contains="项目") # data_list = [] # for obj in data_qs: # data_dic = { # "id": obj.id, # "name": obj.name, # "tester": obj.tester # } # data_list.append(data_dic) # return JsonResponse(data_list, safe=False) def post(self, request): # 视图函数和类视图中的请求方法,一定要返回HttpResponse对象或者子类对象 # a.第一个参数为content,需要传递响应数据(类型为字符串或者字节类型) # b.可以使用content_type关键字参数来指定响应报文类型(text/html、application/json等等) # c.可以使用status关键字参数来指定响应状态码 # 创建数据 # 方法一: # data=ProjectsModel(name="是个名字a a ",leader="测试leader",tester="测试人",programmer="五星开发",publish_app="发布应用",desc="没有描述信息") # data.save() # 方法二: # data=ProjectsModel.objects.create(name="是个名字a a ",leader="测试leader",tester="测试人",programmer="五星开发",publish_app="发布应用",desc="没有描述信息") body_byte_data = request.body.decode() body_str_data = json.dumps(body_byte_data, ensure_ascii=False) data_dic = eval(json.loads(body_str_data)) create_data = ProjectsModel.objects.create(**data_dic) return HttpResponse(create_data, content_type="application/json", status=200) def put(self, request, pk): # 场景一: # 通过id搜索出来对应的数据,并修改指定id的数据 query_data = ProjectsModel.objects.get(pk=pk) # # 读取输入的json数据转化为dic类型 body_byte_data = request.body.decode() body_str_data = json.dumps(body_byte_data, ensure_ascii=False) data_dic = eval(json.loads(body_str_data)) # # 更新对应的字段 query_data.name = data_dic["name"] query_data.leader = data_dic["leader"] query_data.tester = data_dic["tester"] query_data.programmer = data_dic["programmer"] query_data.publish_app = data_dic["publish_app"] query_data.desc = data_dic["desc"] query_data.save() return HttpResponse("PUT请求,修改数据成功") # 场景二: # query_data = ProjectsModel.objects.filter(id=pk).update(leader="hahahha") # update_data={ # "name":query_data.name # } # return HttpResponse("PUT请求,update修改数据成功") def delete(self, request, pk): dele_data = ProjectsModel.objects.get(pk=pk) dele_data.delete() return HttpResponse("DELETE删除成功")
使用postman进行调试
查询所有数据:
查询指定数据
创建数据
修改数据
删除数据:
这个方法主要特点是:
- 共用一个视图类
- 全量查询和部分查询结合在一起
如果后面需要根据接口新增功能逻辑时候,兼顾到接口请求的兼容性就越来越困难,维护起来也不方便。
写法二:(推荐)
项目路由表:
这里我们改造了下路由路径:
需要传递pk的,我们就指定去类名为ProjectsDetailViews里去找,比如删除、修改、根据pk值查找;
不需要传递pk的,我们就指定去类名为ProjectsViews里去找,比如新增数据、全量查询。
urlpatterns = [ path('projects/',views.ProjectsViews.as_view()), path('projects/<int:pk>/',views.ProjectsDetailViews.as_view()) ]
项目视图集文件:
class ProjectsDetailViews(View): # 查询指定pk的数据 def get(self, request, pk): ret = { "msg": "传参异常", "code": 404 } try: query_data = ProjectsModel.objects.get(pk=pk) # 如果入参是不存在的id数据,抛出异常 except Exception: return JsonResponse(ret, json_dumps_params={"ensure_ascii": False}, status=404) data_dict = { "id": query_data.id, "name": query_data.name, "leader": query_data.leader } return JsonResponse(data_dict, json_dumps_params={"ensure_ascii": False}, status=200) # 更新数据 def put(self, request, pk): ret = { "msg": "传参异常", "code": 404 } try: #查出对应id的数据 query_data=ProjectsModel.objects.get(pk=pk) #提取传入的参数 data_str=request.body.decode('utf-8') data_dict=json.loads(data_str) #修改老数据,传入新数据给对应字段 query_data.name=data_dict["name"] query_data.leader=data_dict["leader"] query_data.desc=data_dict["desc"] except Exception: return JsonResponse(ret, json_dumps_params={"ensure_ascii": False}, status=200) #保存更新的数据 query_data.save() #输出战展示数据 data_dict = { "id": query_data.id, "name": query_data.name, "leader": query_data.leader } return JsonResponse(data_dict,json_dumps_params={"ensure_ascii":False},status=200) # 删除数据 def delete(self, request, pk): ret={ "msg":"删除成功!" } ret_error = { "msg": "传参异常", "code": 404 } try: # 根据id查出对应数据 query_data = ProjectsModel.objects.get(pk=pk) #删除指定数据 query_data.delete() #一般删除数据的输出为None except Exception: return JsonResponse(ret_error,json_dumps_params={"ensure_ascii":False},status=200) return JsonResponse(ret,json_dumps_params={"ensure_ascii":False},status=200)
class ProjectsViews(View): # 查询全部数据 def get(self, request): pro_data=ProjectsModel.objects.all() pro_list=[] for pro in pro_data: pro_dict={ "id": pro.id, "name": pro.name, "leader": pro.leader } pro_list.append(pro_dict) return JsonResponse(pro_list,safe=False, json_dumps_params={"ensure_ascii": False}, status=200) # 创建数据 def post(self, request): ret = { "msg": "传参异常", "code": 404 } try: json_str = request.body.decode('utf-8') data_dict=json.loads(json_str) #如果入参不是json格式数据,抛出异常 except json.JSONDecodeError: return JsonResponse(ret,json_dumps_params={"ensure_ascii": False}, status=404) create_data=ProjectsModel.objects.create(**data_dict) create_data.save() pro_dict = { "id": create_data.id, "name": create_data.name, "leader": create_data.leader } return JsonResponse(pro_dict,json_dumps_params={"ensure_ascii": False}, status=200)