Django REST Framework(十二)视图集-GenericViewSet

打印 上一主题 下一主题

主题 1009|帖子 1009|积分 3027

GenericViewSet 是 Django REST Framework 中的一个类,它联合了 GenericAPIView 和 ViewSetMixin 的功能。它的主要目的是简化视图代码,通过将独特的代码作为类属性进行抽象,使代码更加可复用
直接使用 ViewSet 的未便之处

直接使用 ViewSet 时,像 list、retrieve、create、update 和 destroy 这样的方法都必要手动编写。而这些方法与 Mixin 扩展类提供的方法同名,因此我们可以通过继承相应的 Mixin 扩展类来复用这些方法。然而,Mixin 扩展类依赖于 GenericAPIView,以是我们还必要继承 GenericAPIView。
GenericViewSet 通过继承 GenericAPIView 和 ViewSetMixin,资助我们完成了这样的继承工作,使我们可以直接搭配 Mixin 扩展类使用,而无需手动编写这些方法。
示例

下面是如何使用 GenericViewSet 的示例:
  1. from rest_framework.viewsets import GenericViewSet
  2. class BookView(GenericViewSet):
  3.     def list(self, request):
  4.         books = Book.objects.all()
  5.         bs = BookSerializer(instance=books, many=True)
  6.         return Response(bs.data)
  7.     def create(self, request):
  8.         bs = BookSerializer(data=request.data)
  9.         if bs.is_valid():
  10.             bs.save()
  11.             return Response(bs.data)
  12.         else:
  13.             return Response(bs.errors)
  14.     def retrieve(self, request, pk):
  15.         book = Book.objects.get(pk=pk)
  16.         bs = BookSerializer(instance=book)
  17.         return Response(bs.data)
  18.     def update(self, request, pk):
  19.         instance = Book.objects.get(pk=pk)
  20.         bs = BookSerializer(instance=instance, data=request.data)
  21.         if bs.is_valid():
  22.             bs.save()
  23.             return Response(bs.data)
  24.         else:
  25.             return Response(bs.errors)
  26.     def delete(self, request, pk):
  27.         Book.objects.get(pk=pk).delete()
  28.         return Response(status=status.HTTP_204_NO_CONTENT)
复制代码
urls :
  1. from django.urls import path, re_path
  2. from vset.views import BookView
  3. urlpatterns = [
  4.     # path("set", views.BookView.as_view({"http请求":"视图方法"})),
  5.     path("books/", BookView.as_view({
  6.         "get": "list",
  7.         "post": "create"
  8.     })),
  9.     re_path("^books/(?P<pk>\d+)$", BookView.as_view({
  10.         "get": "retrieve",
  11.         "put": "update",
  12.         "delete": "delete",
  13.     })),
  14. ]
复制代码
集合我们上面学习的模型扩展类,实现简写操作,视图,代码:
  1. from rest_framework.viewsets import GenericViewSet
  2. from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \
  3.     DestroyModelMixin
  4. class BookView(GenericViewSet, ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin,
  5.                           DestroyModelMixin):
  6.     queryset = Book.objects
  7.     serializer_class = BookSerializer
复制代码
这种设置允许你在不手动编写每个方法的情况下,定义 CRUD 操作,充分利用 Mixin 扩展类和 GenericViewSet 的功能。
详细解释


  • GenericViewSet 继承自 GenericAPIView 和 ViewSetMixin,并且可以与各种 Mixin 扩展类一起使用,如 ListModelMixin、CreateModelMixin、RetrieveModelMixin、UpdateModelMixin 和 DestroyModelMixin。
  • queryset 属性定义了视图集将使用的查询集。在这个示例中,BookView 将使用 Book 模型的全部对象。
  • serializer_class 属性定义了视图集将使用的序列化器类。在这个示例中,BookView 将使用 BookSerializer。
  • list 方法 返回全部图书的列表。
  • create 方法 创建一本新图书。
  • retrieve 方法 返回指定 ID 的图书。
  • update 方法 更新指定 ID 的图书。
  • delete 方法 删除指定 ID 的图书。
通过上述设置,使用 GenericViewSet 可以极大地简化视图的编写过程,制止重复代码,并提高代码的可维护性

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表