• 【Django 05】Django-DRF(ModelViewSet)、路由组件、自定义函数


    1. Django-DRF(ModelViewSet)

    1.1 DRF是什么?

    ModelViewSet 是 Django REST framework 提供的一个视图集类,它封装了常见的模型操作方法。

    模型类提供了默认的增删改查功能

    它继承自 GenericViewSetListModelMixinRetrieveModelMixinCreateModelMixinUpdateModelMixinDestoryModelMixin

    知识点请求url特点
    GenericViewSet提供一组通用的视图方法,方便实现特定功能
    ListModelMixinget127.0.0.1:8000/book/提供 list 方法,用于获取资源列表
    RetrieveModelMixinget127.0.0.1:8000/book/{1}/提供 retrieve 方法,用于获取单个资源的详细信息
    CreateModelMixinpost127.0.0.1:8000/book/提供 create 方法,用于创建资源
    UpdateModelMixinput127.0.0.1:8000/book/{1}/提供 update 方法,用于更新资源
    DestroyModelMixindetete127.0.0.1:8000/book/{1}/提供 destroy 方法,用于删除资源
    自定义get/post127.0.0.1:8000/book/自定义用户自定义方法/函数

    这些技术知识点可以配合使用,帮助我们快速构建出具有 CRUD 功能的 Web 应用,并且遵循了 Django 框架的惯例和最佳实践。它们的应用场景包括博客系统、电商平台、社交网络等各种类型的 Web 应用。通过使用这些技术知识点,我们能够提高开发效率,减少重复的代码编写工作,并且保证代码的一致性和可维护性。

    1.2 如何使用

    设置 queryset 属性为要查询的对象集合,并设置 serializer_class 属性为对应的序列化器类。

    1.2.1 示例

    view.py

    from rest_framework.viewsets import ModelViewSet
    class YourModelViewSet(ModelViewSet):
        queryset = YourModel.objects.all()
        serializer_class = YourModelSerializer
    
    • 1
    • 2
    • 3
    • 4

    使用 ModelViewSet 后,你将自动获得默认的 CRUD 方法。

    from rest_framework.decorators import action
    #### modelviewset
    class GoodsCategoryViewSet(ModelViewSet):
        # 指定查询集(用到的数据)
        queryset = GoodsCategory.objects.all()
        # 指定查询集用到的序列化容器
        serializer_class = GoodsCategorySerializer
    
        @action(detail=False, methods=['get'])
        def latest(self, request):
            latest_obj = GoodsCategory.objects.latest('id')
            print(latest_obj)
            return Response("helllo 你调用了自定义的函数")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    serializer.py

    class GoodsSerializer(ModelSerializer):
    
        # 外键字段相关的数据 需要单独写
        category = GoodsCategorySerializer()
    
        class Meta:
            # 指定需要序列化的表
            model = Goods
            # 指定我们需要序列化的字段
            fields = '__all__'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2. Django-DRF 路由组件

    2.1 路由组件是什么?

    DefaultRouter是Django REST framework中提供的一个路由器类,用于自动生成URL路由。

    路由器是将URL与视图函数或视图集关联起来的一种机制。Django REST framework的路由器通过简单的配置可以自动生成标准的URL路由,从而减少了手动编写URL路由的工作量。

    2.2 DefaultRouter的使用方法

    urls.py

    from django.contrib import admin
    from django.urls import path
    from apps.erp_test.views import *
    
    from rest_framework import routers
    
    router = routers.DefaultRouter()
    router.register('GoodsCategory', GoodsCategoryViewSet)
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('filtergoodscategory/', FilterGoodsCategory),
        path('insertgoodscategory/', InsertGoodsCategory),
        path('filtergoodscategoryapi/', FilterGoodsCategoryAPI.as_view()),
        path('getgoods/', GetGoods.as_view()),
    ]
    
    
    urlpatterns += router.urls
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    在这里插入图片描述

    主要是将一个类里面的所有方法都加入到路由里面来。

    使用routers.DefaultRouter()​创建了一个默认的路由器对象,并使用router.register()​方法注册了一个视图集,GoodsCategoryViewSet​。这样可以自动为这个视图集生成对应的URL路由,并将其添加到urlpatterns​中。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3. Django-DRF 自定义函数

    3.1 自定义函数是什么

    from rest_framework.decorators import action

    @action 是 Django REST framework 中的一个装饰器,用于将自定义函数转换为视图集的一个动作。@action 装饰器提供了一种定义自定义函数的方式,这些函数并不直接对应于标准的 CRUD 操作(Create-Read-Update-Delete),而是实现一些其他的自定义行为或业务逻辑。
    “ @action 装饰器”用于在 ViewSet 中创建自定义动作(custom action),为 ViewSet 提供了更灵活应用且 @action 只在ViewSet视图集中生效。视图集中附加action装饰器可接收两个参数:
    (1)methods: 声明该action对应的请求方式.
    (2)detail: True/False声明该action的路径是否是action对应的请求方式。

    3.2 如何使用

    views.py

    class GoodsCategoryViewSet(ModelViewSet):
        # 指定查询集(用到的数据)
        queryset = GoodsCategory.objects.all()
        # 指定查询集用到的序列化容器
        serializer_class = GoodsCategorySerializer
    
        @action(detail=False, methods=['get'])
        def latest(self, request):
            latest_obj = GoodsCategory.objects.latest('id')
            print(latest_obj)
            return Response("helllo 你调用了自定义的函数")
    
    
        @action(detail=False, methods=['get','post'])
        def delete_example(self, request):
            name = request.data.get('name')
            # 删除名称为 'name' 的商品
            categories_to_delete = GoodsCategory.objects.filter(name=name)
            # 使用delete()方法删除对象
            deleted_count= categories_to_delete.delete()
            print(f"Deleted {deleted_count} categories.")      
    
        @action(detail=False, methods=['get','post'])
        def create_example(self, request):
            name = request.data.get('name')
                # 使用create()方法创建新的商品分类对象
            created_category = GoodsCategory.objects.create(name)
            print("Created category:", created_category)   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    其中,detail=False 表示该动作不需要处理单个对象,而是处理整个集合;

    @action 装饰的函数需要作为方法定义在视图集类中,并且在使用 router.register() 注册视图集时,需要指定 basename 参数,以确保该动作的 URL 能够正确映射到视图集。

  • 相关阅读:
    LeetCode128. Longest Consecutive Sequence
    063:vue+openlayers绘制自由线段、自由多边形(代码示例)
    对比国内主流开源 SQL 审核平台 Yearning vs Archery
    QScrollBar滚动条、QSlider滑块、 QDial表盘
    什么是隧道代理,要怎么用?| 实用教程
    【17】Java常见的面试题汇总(设计模式)
    思维调试:调用ShellExecute后为什么程序没有启动
    elasticsearch1
    费曼学习法(一)
    Swin V2:向更大容量、更高分辨率的更大模型迈进
  • 原文地址:https://blog.csdn.net/weixin_42322991/article/details/133978718