【阶段小结】--使用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)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 Django 模型定义示例: ```python from django.db import models class Book(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=50) published_date = models.DateField() def __str__(self): return self.title ``` 这个模型定义了一个名为 `Book` 的数据模型,包含书的标题、作者和出版日期。`__str__` 方法用于返回模型的字符串表示。 接下来,我们需要实现一个视图来处理前端页面的增删改查操作。这里我们使用 Django 自带的通用视图。 ```python from django.views.generic.list import ListView from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.urls import reverse_lazy from .models import Book class BookListView(ListView): model = Book template_name = 'book_list.html' context_object_name = 'books' class BookCreateView(CreateView): model = Book template_name = 'book_form.html' fields = ['title', 'author', 'published_date'] success_url = reverse_lazy('book_list') class BookUpdateView(UpdateView): model = Book template_name = 'book_form.html' fields = ['title', 'author', 'published_date'] success_url = reverse_lazy('book_list') class BookDeleteView(DeleteView): model = Book template_name = 'book_confirm_delete.html' success_url = reverse_lazy('book_list') ``` 这个视图包含了四个类,分别用于显示书籍列表、创建、更新和删除书籍。这些视图都基于 Django 的基本视图类 `ListView`、`CreateView`、`UpdateView` 和 `DeleteView`。我们还需要定义相应的模板来呈现这些视图。 以下是一个简单的书籍列表页面模板 `book_list.html`: ```html {% extends 'base.html' %} {% block content %} <h1>Book List</h1> <ul> {% for book in books %} <li>{{ book.title }}</li> {% empty %} <li>No books yet.</li> {% endfor %} </ul> <a href="{% url 'book_create' %}">Add Book</a> {% endblock %} ``` 这个模板通过使用 Django 模板语言来迭代渲染书籍列表,并提供一个链接来添加新书籍。 以下是一个简单的书籍表单页面模板 `book_form.html`: ```html {% extends 'base.html' %} {% block content %} <h1>{% if object.pk %}Update{% else %}Create{% endif %} Book</h1> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">{% if object.pk %}Update{% else %}Create{% endif %}</button> </form> {% endblock %} ``` 这个模板渲染一个书籍表单,并提供一个提交按钮来创建或更新书籍。 以下是一个简单的书籍删除确认页面模板 `book_confirm_delete.html`: ```html {% extends 'base.html' %} {% block content %} <h1>Delete Book</h1> <p>Are you sure you want to delete "{{ object }}"?</p> <form method="post"> {% csrf_token %} <button type="submit">Delete</button> <a href="{% url 'book_list' %}">Cancel</a> </form> {% endblock %} ``` 这个模板渲染一个删除确认页面,并提供一个提交按钮来删除书籍,以及一个取消链接来返回书籍列表页面。 最后,我们需要定义一个 URL 映射来将这些视图和模板链接起来。这里使用 Django 的 URLconf 来实现。 ```python from django.urls import path from .views import BookListView, BookCreateView, BookUpdateView, BookDeleteView urlpatterns = [ path('', BookListView.as_view(), name='book_list'), path('create/', BookCreateView.as_view(), name='book_create'), path('update/<int:pk>/', BookUpdateView.as_view(), name='book_update'), path('delete/<int:pk>/', BookDeleteView.as_view(), name='book_delete'), ] ``` 这个 URL 映射将每个视图链接到相应的 URL,并指定每个视图的名称。现在,我们就可以通过访问相应的 URL 来使用这些视图了。 这样,我们就完成了一个简单的 Django 应用程序,可以进行前端页面的增删改查操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高老庄里的高小翠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值