DRF——viewsets使用

本文介绍Django REST framework中视图集的使用方法,包括如何通过GenericViewSet实现RESTful API,以及如何利用过滤类实现数据过滤。文章还详细介绍了自定义过滤方法和排序字段的设置。

GenericViewSet继承的ViewSetMixin重写了视图类的as_view方法,viewsets可以使用router进行字段注册,也可以自己进行绑定

from rest_framework.routers import DefaultRouter
router=DefaultRouter()
router.register(r'goods',GoodsListViewSet)
class GoodsSerializer(serializers.ModelSerializer):
    """
    序列化类
    """
    class Meta:
        model=Goods
        fields="__all__"
class ModelFilter(django_filters.rest_framework.FilterSet):
    """
    过滤类
    """
    pricemin=django_filters.NumberFilter(name="shop_price",lookup_expr="gt")
    pricemax = django_filters.NumberFilter(name="shop_price", lookup_expr="lt")
    top_category=django_filters.NumberFilter(method="top_category_filter")
    def top_category_filter(self,queryset,name,value):
        queryset=queryset.filter(Q(category_id=value)|
                                 Q(category__parent_category__parent_category_id=value)|
                                 Q(category__parent_category_id=value))
        return queryset

    class Meta:
        model=Goods
        fields=["pricemin","pricemax","top_category"]
from rest_framework import mixins,viewsets,filters
from rest_framework.pagination import PageNumberPagination
from django_filters.rest_framework import DjangoFilterBackend

from .models import Model
from .serializer import ModelSerializer
from .filters import ModelFilter 

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 12
    page_size_query_param = 'page_size'
    page_query_param = "page"
    max_page_size = 100

#mixins.ListModelMixin提供了list方法,接收到get请求时会被调用
class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
    """
    列出模型所有数据,包含分页,搜索,过滤,排序功能
    """
    queryset = Model.objects.all().order_by("id")
    serializer_class = ModelSerializer #自定义序列化类
    pagination_class = StandardResultsSetPagination #自定义分页类
    #设置过滤的backends
    filter_backends = (DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter)


    #filter_fields=(("","","")#过滤字段,也可以自定义过滤的类
    filter_class=ModelFilter #自定义过滤的类
    search_fields=("","","") #搜索字段
    ordering_fields=("","")  #排序字段
### Django REST Framework (DRF) 的架构设计及其实现方式 #### 1. DRF的核心组件 Django REST Framework 是一种功能强大且灵活的工具包,旨在帮助开发者快速高效地构建 Web APIs。其核心设计理念围绕着几个关键组件展开: - **序列化器(Serializers)** 序列化器的作用是将复杂的数据库对象(如模型实例)转换为原生 Python 数据类型,这些数据随后可以被轻松渲染成 JSON 或其他内容格式[^1]。 - **视图(Views)** DRF 提供了多种类型的视图支持,其中 `APIView` 是所有视图的基础类。通过继承该类,开发人员能够自定义 HTTP 方法的行为逻辑[^3]。此外还有更高级别的通用视图(Generic Views)、基于混合类的视图以及视图集(ViewSets),它们进一步简化了常见操作模式下的代码编写工作量。 - **路由器(Routers)** 路由机制负责将 URL 请求映射至相应的处理函数上。对于简单的 CRUD 接口来说,默认提供的 SimpleRouter 和 DefaultRouter 可以很好地满足需求;而对于更加复杂的应用场景,则允许手动调整路径规则或者扩展标准行为。 - **身份验证(Authentication & Permissions)** 安全是任何网络服务都不可忽视的重要方面之一。在项目全局范围内设定统一的身份校验策略有助于提升整体安全性水平。例如,在上述例子中展示了如何利用 JWT 进行令牌认证,并限定只有经过授权后的用户才能访问特定资源[^4]。 #### 2. 实现流程概述 以下是使用 DRF 创建 RESTful API 的基本步骤说明: - **环境准备** 开始之前需先完成必要的依赖项安装过程,比如导入 django-rest-framework 包本身以及其他可能需要用到的相关插件或第三方库文件等操作[^2]。 - **模型定义(Model Definition)** 根据业务实际需要确定实体间的关系结构并将其转化为对应的 ORM 表达形式——即所谓的 “Model”。 - **序列化配置(Serializer Configuration)** 设计好前端所需展示字段列表之后就可以着手制定相应规则来控制哪些属性应该暴露出去给外部调用了。 - **视图层开发(View Development)** 结合前面提到的各种 View 类型选取最适合当前任务特点的一种来进行具体编码实现活动。 - **路由安排(URL Routing Setup)** 明确各个端点地址及其对应的功能模块之间的关联关系后即可正式确立整个系统的导航体系框架布局方案。 - **安全防护措施部署(Security Measures Deployment)** 制定合理的权限管理制度确保敏感信息不会轻易泄露的同时也要兼顾用户体验流畅度考量因素影响下做出适当权衡取舍决定最终实施方案细节部分描述清楚一点更好理解一些哦~ ```python from rest_framework import serializers, viewsets from .models import MyModel class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = '__all__' class MyModelViewSet(viewsets.ModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值