[フェーズの概要] -- Django を使用してデータの追加、削除、変更、クエリ操作を実現するインターフェイスを作成します

 これを学習した後、Django の基本的な使い方とデータの操作について学びました。インターフェース データの追加、削除、変更、クエリの 2 つの記述方法は次のとおりです。

書き方1:

サブアプリケーションルーティングテーブル 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

インターフェイスを設計するとき、データの追加、削除、変更、クエリに応じて、さまざまなリクエスト メソッドがマッピングされます。

新しいデータ------>ポストリクエスト、入力パラメータはjson形式のデータです

データの削除------>削除リクエスト、入力パラメータはプロジェクトIDです

データの変更------>putリクエスト。更新するIDと属性値を渡すことができます

すべてのデータをクエリ----->リクエストを取得

指定されたIDのデータをクエリ -------> リクエストを取得

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 を使用したデバッグ

すべてのデータをクエリします。

 指定されたデータをクエリする

データを作成する

 データを変更する

 データを削除します:

 この方法の主な特徴は次のとおりです。

  • ビュークラスを共有する
  • 完全なクエリと部分的なクエリの組み合わせ

後でインターフェースに基づいて関数ロジックを追加する必要がある場合、インターフェース要求の互換性を考慮することがますます困難になり、保守が不便になります。

書き方2:(推奨)

プロジェクトルーティングテーブル:

ここではルーティング パスを変更しました。

pk を渡す必要がある場合は、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)

おすすめ

転載: blog.csdn.net/weixin_43569834/article/details/131130870