Django REST Framework: Generics or ModelViewSets?

后端 未结 3 862
说谎
说谎 2020-12-31 10:53

I use generics and plain urls for my REST API, but now I stuck with problem: I want custom actions, simple views to make some things with my models, like \"run\", \"publish\

3条回答
  •  我在风中等你
    2020-12-31 11:03

    The difference between Generics or ModelViewSet is that:

    1. Convenient
      Usually ModelViewSet is more convenient. Because ModelViewSet support creating url pattern automatically with DRF router. But Generics don't. you do yourself.

    2. Shorten and crispy code
      If you want to create CRUD, Generics needs two classes(ListCreateAPIView and RetrieveUpdateDestroyAPIView). But ModelViewSet needs only one class(ModelViewSet).

    Check out Declaration below. Both inherits from GenericAPIView and mixins.CreateModelMixin, mixins.ListModelMixin It provides equivalent functionality basically. It depends on what you prefer. But I usually use ViewSet in most cases.


    Declaration

    # 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):
    

    Example code

    # 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
    

提交回复
热议问题