They are different, let’s see.
DRF has two main systems for handling views:
- APIView: This provides methods handler for http verbs:
- ViewSet: This is an abstraction over APIView, which provides actions as methods:
list: read only, returns multiple resources (http verb:
get). Returns a list of dicts.
retrieve: read only, single resource (http verb:
get, but will expect an id in the url). Returns a single dict.
create: creates a new resource (http verb:
update/partial_update: edits a resource (http verbs:
destroy: removes a resource (http verb:
Both can be used with normal django urls.
Because of the conventions established with the actions, the
ViewSet has also the ability to be mapped into a router, which is really helpful.
Now, both of this Views, have shortcuts, these shortcuts give you a simple implementation ready to be used.
APIView, this gives you shortcuts that map closely to your database models. Adds commonly required behavior for standard list and detail views. Gives you some attributes like, the
serializer_class, also gives
GenericViewSet: There are many GenericViewSet, the most common being
ModelViewSet. They inherit from
GenericAPIView and have a full implementation of all of the actions:
updated, etc. Of course, you can also pick some of them, read the docs.
So, to answer your question: DRY, if you are doing something really simple, with a
ModelViewSet should be enough, even redefining and calling
super also is enough. For more complex cases, you can go for lower level classes.
Hope to have helped you!