IT评测·应用市场-qidao123.com

标题: Django REST Framework(十二)视图集-GenericViewSet [打印本页]

作者: 钜形不锈钢水箱    时间: 2024-7-26 04:53
标题: Django REST Framework(十二)视图集-GenericViewSet
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 可以极大地简化视图的编写过程,制止重复代码,并提高代码的可维护性

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




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4