【问题标题】:What is the difference in use or inherit from APIView and Model ViewSetAPIView和Model ViewSet在使用或继承上有什么区别
【发布时间】:2017-06-12 05:21:20
【问题描述】:

当我想序列化我的模型以获取其对象/记录列表时,我会遇到关于何时使用 APIView 和何时使用 ModelViewSet 的区别?

例如,在APIView documentation 中,我们可以通过 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) 

我已经通过这种方式使用 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', )

如何确定我应该何时使用 APIView 或 ModelViewSet 来执行此任务?

【问题讨论】:

标签: django django-views django-rest-framework


【解决方案1】:

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

首先,APIViewViewSet 与模型无关,而 ModelViewSetGenericAPIViewListAPIView(和 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

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

class UserRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

【讨论】:

  • 感谢您的回复。这很有说明性。使用 ListCreateAPIView 我可以更新(PUT)一些具有 ManyToManyFields 的模型吗?
  • 更新视图应该是 UpdateAPIView(或 UserRetrieveUpdateDestroyAPIView)。我刚刚更新了我的帖子。请注意,相关字段是序列化程序的域,而不是视图。
  • 我理解@Linovia,我在考虑继承RetrieveUpdateDestroyAPIView
  • stackoverflow.com/a/49489829/8454203 很好地解释了这一点。
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 2015-03-11
  • 2018-11-24
  • 2015-08-03
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多