GenericViewSet 是 Django REST Framework 中的一个类,它联合了 GenericAPIView 和 ViewSetMixin 的功能。它的主要目的是简化视图代码,通过将独特的代码作为类属性进行抽象,使代码更加可复用
直接使用 ViewSet 的未便之处
直接使用 ViewSet 时,像 list、retrieve、create、update 和 destroy 这样的方法都必要手动编写。而这些方法与 Mixin 扩展类提供的方法同名,因此我们可以通过继承相应的 Mixin 扩展类来复用这些方法。然而,Mixin 扩展类依赖于 GenericAPIView,以是我们还必要继承 GenericAPIView。
GenericViewSet 通过继承 GenericAPIView 和 ViewSetMixin,资助我们完成了这样的继承工作,使我们可以直接搭配 Mixin 扩展类使用,而无需手动编写这些方法。
示例
下面是如何使用 GenericViewSet 的示例:
- from rest_framework.viewsets import GenericViewSet
- class BookView(GenericViewSet):
- def list(self, request):
- books = Book.objects.all()
- bs = BookSerializer(instance=books, many=True)
- return Response(bs.data)
- def create(self, request):
- bs = BookSerializer(data=request.data)
- if bs.is_valid():
- bs.save()
- return Response(bs.data)
- else:
- return Response(bs.errors)
- def retrieve(self, request, pk):
- book = Book.objects.get(pk=pk)
- bs = BookSerializer(instance=book)
- return Response(bs.data)
- def update(self, request, pk):
- instance = Book.objects.get(pk=pk)
- bs = BookSerializer(instance=instance, data=request.data)
- if bs.is_valid():
- bs.save()
- return Response(bs.data)
- else:
- return Response(bs.errors)
- def delete(self, request, pk):
- Book.objects.get(pk=pk).delete()
- return Response(status=status.HTTP_204_NO_CONTENT)
复制代码 urls :
- from django.urls import path, re_path
- from vset.views import BookView
- urlpatterns = [
- # path("set", views.BookView.as_view({"http请求":"视图方法"})),
- path("books/", BookView.as_view({
- "get": "list",
- "post": "create"
- })),
- re_path("^books/(?P<pk>\d+)$", BookView.as_view({
- "get": "retrieve",
- "put": "update",
- "delete": "delete",
- })),
- ]
复制代码 集合我们上面学习的模型扩展类,实现简写操作,视图,代码:
- from rest_framework.viewsets import GenericViewSet
- from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \
- DestroyModelMixin
- class BookView(GenericViewSet, ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin,
- DestroyModelMixin):
- queryset = Book.objects
- 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企服之家,中国第一个企服评测及商务社交产业平台。 |