【阶段小结】--使用Django写接口实现数据的增删改查操作

简介: 【阶段小结】--使用Django写接口实现数据的增删改查操作

学到这里,我们了解了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)

相关文章
|
1月前
|
JavaScript 前端开发 Python
django接收前端vue传输的formData图片数据
django接收前端vue传输的formData图片数据
33 4
|
1月前
|
搜索推荐 关系型数据库 MySQL
#874358#基于django/neo4j的电视剧浏览数据推荐系统
#874358#基于django/neo4j的电视剧浏览数据推荐系统
21 0
|
3月前
|
数据采集 自然语言处理 监控
【优秀python毕设案例】基于python django的新媒体网络舆情数据爬取与分析
本文介绍了一个基于Python Django框架开发的新媒体网络舆情数据爬取与分析系统,该系统利用Scrapy框架抓取微博热搜数据,通过SnowNLP进行情感分析,jieba库进行中文分词处理,并以图表和词云图等形式进行数据可视化展示,以实现对微博热点话题的舆情监控和分析。
138 2
【优秀python毕设案例】基于python django的新媒体网络舆情数据爬取与分析
|
3月前
|
监控 数据可视化 前端开发
基于python django生产数据与计划大屏,可链接数据库
本文介绍了一个基于Python Django框架开发的生产数据与计划大屏系统,该系统能够实时采集和展示生产数据,支持数据可视化和实时更新,以提高生产监控的效率和质量。
|
3月前
|
数据可视化 安全 前端开发
基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据
本文介绍了一个基于Django框架开发的美团药品数据分析与可视化系统,该系统具备多用户功能,支持数据的增删改查操作,并采用MySQL、pandas、echarts和bootstrap技术栈,为用户提供了一个高效、安全且实用的药品数据管理和分析平台。
基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据
|
3月前
|
数据采集 数据可视化 数据挖掘
基于Django的数据分析可视化系统,有后台,有增删改查,实现多用户登录
本文介绍了一个基于Django框架开发的今日头条数据分析可视化系统,该系统具备后台管理、增删改查功能以及多用户登录,利用数据可视化技术为新闻媒体行业提供数据管理和决策支持。
基于Django的数据分析可视化系统,有后台,有增删改查,实现多用户登录
|
3月前
|
前端开发 关系型数据库 MySQL
Python基于Django框架图书管理系统,Bootstrap框架UI,后台EasyUI框架UI,有登录,实现增删改查的富文本效果
本文介绍了一个使用Python Django框架开发的图书管理系统,该系统采用Bootstrap框架进行前端UI设计,EasyUI框架用于后台UI界面,集成了富文本编辑器,并实现了登录及增删改查功能。
|
3月前
|
API 数据库 开发者
【独家揭秘】Django ORM高手秘籍:如何玩转数据模型与数据库交互的艺术?
【8月更文挑战第31天】本文通过具体示例详细介绍了Django ORM的使用方法,包括数据模型设计与数据库操作的最佳实践。从创建应用和定义模型开始,逐步演示了查询、创建、更新和删除数据的全过程,并展示了关联查询与过滤的技巧,帮助开发者更高效地利用Django ORM构建和维护Web应用。通过这些基础概念和实践技巧,读者可以更好地掌握Django ORM,提升开发效率。
41 0
|
4月前
|
存储 JavaScript 前端开发
Django + Vue 实现图片上传功能的全流程配置与详细操作指南
 在现代Web应用中,图片上传是一个常见且重要的功能。Django作为强大的Python Web框架,结合Vue.js这样的现代前端框架,能够高效地实现这一功能。本文将详细介绍如何在Django项目中配置图片上传的后端处理,并在Vue前端实现图片的选择、预览和上传功能。
|
3月前
|
关系型数据库 MySQL Python
[django]数据的导入和导出
[django]数据的导入和导出