使用或继承APIView和Model ViewSet有什么区别

bga*_*ial 8 django django-views django-rest-framework

当我想序列化我的模型以获得它们的对象/记录列表时,我会遇到关于何时使用 APIView 和何时使用 ModelViewSet 的差异?

例如,在APIView 文档中,我们使用 ListUser 类及其 get 方法可以获得用户列表

class ListUsers(APIView):
    """
    View to list all users in the system.

    * Requires token authentication.
    * Only admin users are able to access this view.
    """
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAdminUser,)

    def get(self, request, format=None):
        """
        Return a list of all users.
        """
        usernames = [user.username for user in User.objects.all()]
        return Response(usernames) 
Run Code Online (Sandbox Code Playgroud)

我已经通过这种方式使用 ModelViewSet 获得了相同的用户列表:

class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    filter_fields = ('username', 'is_player', 'first_name', 'last_name', 'team' , 'email', )
Run Code Online (Sandbox Code Playgroud)

我如何才能确定何时应该为此任务使用 APIView 或 ModelViewSet?

Lin*_*via 18

问题太开放了,尽管我会尽力回答。

首先,APIView或者ViewSet不绑定到模型,而ModelViewSet, GenericAPIView, ListAPIView(和 co) 是。

*View 和 *ViewSet 之间的主要区别在于 *ViewSet 旨在与路由器一起使用并提供单个类来公开资源,而 *View 将需要两个(一个用于列表/创建,另一个用于详细信息/更新/删除)。

请注意,这APIView是最低级别,仅与 HTTP 动词(get/post/put...)相关联,同时ViewSetGenericAPIView将具有 CRUD,例如 list/update...

为了公开 Django 的模型,您需要

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)

或者

class UserListCreateView(ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)

  • /sf/answers/3464288061/ 也很好地解释了这一点。 (2认同)