Django REST Framework 中,`ModelViewSet` 和 `ReadOnlyModelViewSet` 提供了快速实现常见视图操作的便捷方法。它们分别继承自 `GenericViewSet` 并组合了多个 Mixin 类,使得视图的编写变得更加简单。
ModelViewSet
ModelViewSet` 继承自 `GenericViewSet`,同时包括了以下 Mixin 类:
-
`ListModelMixin`:提供 `list` 方法,用于获取对象列表。
-
`RetrieveModelMixin`:提供 `retrieve` 方法,用于获取单个对象。
-
`CreateModelMixin`:提供 `create` 方法,用于创建新对象。
-
`UpdateModelMixin`:提供 `update` 方法,用于更新对象。
-
`DestroyModelMixin`:提供 `destroy` 方法,用于删除对象。
这样,`ModelViewSet` 提供了完整的 CRUD(创建、读取、更新、删除)操作。```python
python
from rest_framework.viewsets import ModelViewSet
from .models import Book
from .serializers import BookSerializer
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
ReadOnlyModelViewSet
`ReadOnlyModelViewSet` 继承自 `GenericViewSet`,同时包括了以下 Mixin 类:
-
`ListModelMixin`:提供 `list` 方法,用于获取对象列表。
-
`RetrieveModelMixin`:提供 `retrieve` 方法,用于获取单个对象。
这样,`ReadOnlyModelViewSet` 仅提供读取操作(列表和详细信息),而不提供创建、更新和删除操作。
python
from rest_framework.viewsets import ReadOnlyModelViewSet
from .models import Book
from .serializers import BookSerializer
class BookReadOnlyView(ReadOnlyModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
视图和 URL 配置
视图:
对于 `ModelViewSet`:
python
from rest_framework.viewsets import ModelViewSet
from .models import Book
from .serializers import BookSerializer
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
对于 `ReadOnlyModelViewSet`:
python
from rest_framework.viewsets import ReadOnlyModelViewSet
from .models import Book
from .serializers import BookSerializer
class BookReadOnlyView(ReadOnlyModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
URLs:
使用 `ModelViewSet` 配置 URL:
python
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import BookView
router = DefaultRouter()
router.register(r'books', BookView)
urlpatterns = [
path('', include(router.urls)),
]
使用 `ReadOnlyModelViewSet` 配置 URL:
python
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import BookReadOnlyView
router = DefaultRouter()
router.register(r'books', BookReadOnlyView)
urlpatterns = [
path('', include(router.urls)),
]
详细解释
-
ModelViewSet :通过组合多个 Mixin 类,提供了完整的 CRUD 功能。继承 `ModelViewSet` 的视图类只需定义 `queryset` 和 `serializer_class`。
-
ReadOnlyModelViewSet :仅提供读取功能,适用于只需要查看数据而不需要修改数据的场景。继承 `ReadOnlyModelViewSet` 的视图类也只需定义 `queryset` 和 `serializer_class`。
-
queryset 属性定义了视图集将使用的查询集。在上述示例中,`BookView` 和 `BookReadOnlyView` 将使用 `Book` 模型的所有对象。
-
serializer_class 属性定义了视图集将使用的序列化器类。在上述示例中,`BookView` 和 `BookReadOnlyView` 将使用 `BookSerializer`。
-
DefaultRouter:Django REST Framework 提供的一个简单路由器,自动为视图集生成 URL 路由。
通过上述配置,使用 `ModelViewSet` 和 `ReadOnlyModelViewSet` 可以大大简化视图的编写过程,避免重复代码,并提高代码的可维护性和可读性。