Django REST框架:泛型还是模型视图集?

2024-09-24 22:30:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在REST API中使用泛型和普通url,但现在我遇到了一个问题:我希望自定义操作、简单的视图可以用我的模型生成一些东西,比如“run”、“publish”等等

ViewSet给了actiondecorator来创建自定义操作,但是只有在视图集中,还有stepial路由器,它使我们能够使用railsish约定而不是配置来简化所有事情。

但是我发现ModelViewSet给了我们与泛型相同的能力:完整CRUD、序列化器、过滤器、cusstom pre/post和queryset,因此,它引出了一个问题:

如果ModelViewSet提供相同的能力和更多,为什么会有泛型?有什么区别?


Tags: run模型视图restapiurl路由器能力
3条回答

泛型模型视图集之间的区别在于:

  1. 方便
    通常,ModelViewSet更方便。因为ModelViewSet支持使用DRF路由器自动创建url模式。但是不要用泛型,你自己做。

  2. 短而脆的代码
    如果要创建CRUD,泛型需要两个类(listcreateapieview和RetrieveUpdateDestroyAPIView)。但ModelViewSet只需要一个类(ModelViewSet)。

查看下面的声明。两者都继承自GenericAPIViewmixins.CreateModelMixinmixins.ListModelMixin它基本上提供了等效的功能。这取决于你喜欢什么。但在大多数情况下我通常使用ViewSet。


声明

# Generics __________________________________
class ListCreateAPIView(mixins.ListModelMixin,
                        mixins.CreateModelMixin, 
                        GenericAPIView):

# ModelViewSet _____________________________
class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):

# GenericViewSet _____________________________
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):

示例代码

# Generics __________________________________
from rest_framework import generics

class BookList(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

# ModelViewSet _____________________________
from rest_framework import viewsets

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

Why there is generics if ModelViewSet gives same abilities and more?

让我先把这个问题再解释清楚一点。。。

为什么有泛型视图,但也有泛型视图集

这实际上就是为什么REST框架同时支持视图和视图集的问题。回答-视图集对于原型设计或当您的API URL整齐地映射到一个固定的约定(例如CRUD样式的API)时非常有用。视图对于显式或url始终不能灵活地映射到固定约定的情况非常有用。

区别在于他们提供了什么样的方法。

例如:

GenericViewSet继承自GenericAPIView,但不提供基本操作的任何实现。只需要得到你想要的东西,得到你想要的。

ModelViewSet继承自GenericAPIView并包含各种操作的实现。换句话说,您不需要实现基本的操作,如列表、检索、创建、更新或销毁。当然,您可以重写它们并实现自己的列表或创建方法。

您可以在“API参考”一节中阅读有关它的更多信息: ModelViewSet

相关问题 更多 >