They are different, let's see.
DRF has two main systems for handling views:
- APIView: This provides methods handler for http verbs:
get
, post
, put
, patch
, and delete
.
- 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: post
)
update/partial_update
: edits a resource (http verbs: put/patch
)
destroy
: removes a resource (http verb: delete
)
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.
GenericAPIView: for 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 pagination_class
, filter_backend
, etc
GenericViewSet: There are many GenericViewSet, the most common being ModelViewSet
. They inherit from GenericAPIView
and have a full implementation of all of the actions: list
, retrieve
, destroy
, 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!
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…