[Phase Summary]--Use Django to write interface to realize data addition, deletion, modification and query operations

 After learning this, we have learned about the basic use of Django and the operation of data. The following are two different ways of writing for the addition, deletion, modification and query of interface data:

Writing method one:

Sub-application routing table 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())
]

Model class 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

viewset views.py

When designing the interface, different request methods are mapped according to the addition, deletion, modification and query of data:

New data------->post request, the input parameter is data in json format

Delete data------->delete request, the input parameter is the project id

Modify data------->put request, you can pass the id and the attribute value to be updated

Query all data------->get request

Query the data of the specified id -------> get request

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删除成功")

Debugging with postman

Query all data:

 Query specified data

create data

 change the data

 delete data:

 The main features of this method are:

  • share a view class
  • Combining full query and partial query

If it is necessary to add function logic based on the interface later, it will become more and more difficult to take into account the compatibility of interface requests, and it will be inconvenient to maintain.

Writing method 2: (recommended)

Project routing table:

Here we have modified the routing path:

If the pk needs to be passed, we specify to find it in the class name ProjectsDetailViews, such as deleting, modifying, and searching according to the pk value;

If there is no need to pass the pk, we specify to find it in the class name ProjectsViews, such as new data and full query.

urlpatterns = [

    path('projects/',views.ProjectsViews.as_view()),
    path('projects/<int:pk>/',views.ProjectsDetailViews.as_view())
]

Project viewset file:

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)

Guess you like

Origin blog.csdn.net/weixin_43569834/article/details/131130870