如何实现Django DRF中的路由与扩展功能?

2026-05-25 02:371阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计902个文字,预计阅读时间需要4分钟。

如何实现Django DRF中的路由与扩展功能?

一、视图集与路由的使用使用视图集ViewSet,可以将一系列逻辑相关的操作封装到一个类中。例如:

- list():提供一组数据的列表。- retrieve():提供单个数据的详细信息。- create():创建新的数据。- update():保存数据更新。- destroy():删除数据。

二、示例代码pythonfrom rest_framework import viewsets

class MyModelViewSet(viewsets.ModelViewSet): queryset=MyModel.objects.all() serializer_class=MyModelSerializer

一. 视图集与路由的使用

使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:

  • list() 提供一组数据
  • retrieve() 提供单个数据
  • create() 创建数据
  • update() 保存数据
  • destory() 删除数据

ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。

视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。

1. 常用的视图集父类

1.ViewSet

继承自APIView 与 ViewSetMixin作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。

在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。

如何实现Django DRF中的路由与扩展功能?

2.GenericViewSet

使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖与GenericAPIView,所以还需要继承GenericAPIView。

GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用。

3.ModelViewSet

继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

4.ReadOnlyModelViewSet

继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。

下面我们还是通过案例,为大家演示吧!

首先,先创建一个子应用。

python3 manage.py startapp collect

5. 在collect下新建序列化器类

# collect下的serializers.py文件 from students.models import Student from rest_framework import serializers class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = ["id", "name", "age", "sex"] extra_kwargs = { "name": {"max_length": 10, "min_length": 4}, "age": {"max_value": 150, "min_value": 0}, } def validate_name(self, data): if data == "root": raise serializers.ValidationError("用户名不能为root!") return data def validate(self, attrs): name = attrs.get('name') age = attrs.get('age') if name == "alex" and age == 22: raise serializers.ValidationError("alex在22时的故事。。。") return attrs class StudentInfoModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = ["id", "name"]

6. collect下的urls.py

from django.urls import path, re_path from collect import views urlpatterns = [ # 不要在同一个路由的as_view中书写两个同样的键的127.0.0.1:8000/opt/data7/?page=4 page=1 limit 0,10 page=2 limit 10,20 # 偏移量分页 LimitOffsetPagination 前端访问形式:GET 127.0.0.1:8000/opt/data7/?start=4&size=3 start=0 limit 0,10 start=10 limit 10,10 start=20 limit 20,10 """ class StandardPageNumberPagination(PageNumberPagination): """分页相关配置""" page_query_param = "page" # 设置分页页码关键字名 page_size = 3 # 设置每页显示数据条数 page_size_query_param = "size" # 设置指定每页大小的关键字名 max_page_size = 5 # 设置每页显示最大值 class StandardLimitOffsetPagination(LimitOffsetPagination): default_limit = 2 # 默认限制,默认值与PAGE_SIZE设置一致 limit_query_param = "size" # limit参数名 offset_query_param = "start" # offset参数名 max_limit = 5 # 最大limit限制 class Demo7APIView(ListAPIView): queryset = Student.objects.all() serializer_class = StudentModelSerializer # 分页 # 页码分页类 pagination_class = StandardPageNumberPagination # 偏移量分页类 # pagination_class = StandardLimitOffsetPagination

注意:如果在视图内关闭分页功能,只需在视图内设置

pagination_class = None

到此这篇关于Django DRF路由与扩展功能的实现的文章就介绍到这了,更多相关Django DRF路由与扩展内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

标签:实现

本文共计902个文字,预计阅读时间需要4分钟。

如何实现Django DRF中的路由与扩展功能?

一、视图集与路由的使用使用视图集ViewSet,可以将一系列逻辑相关的操作封装到一个类中。例如:

- list():提供一组数据的列表。- retrieve():提供单个数据的详细信息。- create():创建新的数据。- update():保存数据更新。- destroy():删除数据。

二、示例代码pythonfrom rest_framework import viewsets

class MyModelViewSet(viewsets.ModelViewSet): queryset=MyModel.objects.all() serializer_class=MyModelSerializer

一. 视图集与路由的使用

使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:

  • list() 提供一组数据
  • retrieve() 提供单个数据
  • create() 创建数据
  • update() 保存数据
  • destory() 删除数据

ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。

视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。

1. 常用的视图集父类

1.ViewSet

继承自APIView 与 ViewSetMixin作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。

在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。

如何实现Django DRF中的路由与扩展功能?

2.GenericViewSet

使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖与GenericAPIView,所以还需要继承GenericAPIView。

GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用。

3.ModelViewSet

继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

4.ReadOnlyModelViewSet

继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。

下面我们还是通过案例,为大家演示吧!

首先,先创建一个子应用。

python3 manage.py startapp collect

5. 在collect下新建序列化器类

# collect下的serializers.py文件 from students.models import Student from rest_framework import serializers class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = ["id", "name", "age", "sex"] extra_kwargs = { "name": {"max_length": 10, "min_length": 4}, "age": {"max_value": 150, "min_value": 0}, } def validate_name(self, data): if data == "root": raise serializers.ValidationError("用户名不能为root!") return data def validate(self, attrs): name = attrs.get('name') age = attrs.get('age') if name == "alex" and age == 22: raise serializers.ValidationError("alex在22时的故事。。。") return attrs class StudentInfoModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = ["id", "name"]

6. collect下的urls.py

from django.urls import path, re_path from collect import views urlpatterns = [ # 不要在同一个路由的as_view中书写两个同样的键的127.0.0.1:8000/opt/data7/?page=4 page=1 limit 0,10 page=2 limit 10,20 # 偏移量分页 LimitOffsetPagination 前端访问形式:GET 127.0.0.1:8000/opt/data7/?start=4&size=3 start=0 limit 0,10 start=10 limit 10,10 start=20 limit 20,10 """ class StandardPageNumberPagination(PageNumberPagination): """分页相关配置""" page_query_param = "page" # 设置分页页码关键字名 page_size = 3 # 设置每页显示数据条数 page_size_query_param = "size" # 设置指定每页大小的关键字名 max_page_size = 5 # 设置每页显示最大值 class StandardLimitOffsetPagination(LimitOffsetPagination): default_limit = 2 # 默认限制,默认值与PAGE_SIZE设置一致 limit_query_param = "size" # limit参数名 offset_query_param = "start" # offset参数名 max_limit = 5 # 最大limit限制 class Demo7APIView(ListAPIView): queryset = Student.objects.all() serializer_class = StudentModelSerializer # 分页 # 页码分页类 pagination_class = StandardPageNumberPagination # 偏移量分页类 # pagination_class = StandardLimitOffsetPagination

注意:如果在视图内关闭分页功能,只需在视图内设置

pagination_class = None

到此这篇关于Django DRF路由与扩展功能的实现的文章就介绍到这了,更多相关Django DRF路由与扩展内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

标签:实现