You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/tutorial/6-viewsets-and-routers.md
+15-11Lines changed: 15 additions & 11 deletions
Original file line number
Diff line number
Diff line change
@@ -10,10 +10,11 @@ A `ViewSet` class is only bound to a set of method handlers at the last moment,
10
10
11
11
Let's take our current set of views, and refactor them into view sets.
12
12
13
-
First of all let's refactor our `UserList` and `UserDetail`views into a single `UserViewSet`. We can remove the two views, and replace them with a single class:
13
+
First of all let's refactor our `UserList` and `UserDetail`classes into a single `UserViewSet` class. We can remove the two view classes, and replace them with a single ViewSet class:
14
14
15
15
from rest_framework import viewsets
16
16
17
+
17
18
class UserViewSet(viewsets.ReadOnlyModelViewSet):
18
19
"""
19
20
This viewset automatically provides `list` and `retrieve` actions.
@@ -25,13 +26,14 @@ Here we've used the `ReadOnlyModelViewSet` class to automatically provide the de
25
26
26
27
Next we're going to replace the `SnippetList`, `SnippetDetail` and `SnippetHighlight` view classes. We can remove the three views, and again replace them with a single class.
27
28
29
+
from rest_framework import permissions
28
30
from rest_framework.decorators import action
29
31
from rest_framework.response import Response
30
-
from rest_framework import permissions
32
+
31
33
32
34
class SnippetViewSet(viewsets.ModelViewSet):
33
35
"""
34
-
This viewset automatically provides `list`, `create`, `retrieve`,
36
+
This ViewSet automatically provides `list`, `create`, `retrieve`,
35
37
`update` and `destroy` actions.
36
38
37
39
Additionally we also provide an extra `highlight` action.
@@ -64,9 +66,10 @@ To see what's going on under the hood let's first explicitly create a set of vie
64
66
65
67
In the `snippets/urls.py` file we bind our `ViewSet` classes into a set of concrete views.
66
68
67
-
from snippets.views import SnippetViewSet, UserViewSet, api_root
68
69
from rest_framework import renderers
69
70
71
+
from snippets.views import api_root, SnippetViewSet, UserViewSet
72
+
70
73
snippet_list = SnippetViewSet.as_view({
71
74
'get': 'list',
72
75
'post': 'create'
@@ -87,7 +90,7 @@ In the `snippets/urls.py` file we bind our `ViewSet` classes into a set of concr
87
90
'get': 'retrieve'
88
91
})
89
92
90
-
Notice how we're creating multiple views from each `ViewSet` class, by binding the http methods to the required action for each view.
93
+
Notice how we're creating multiple views from each `ViewSet` class, by binding the HTTP methods to the required action for each view.
91
94
92
95
Now that we've bound our resources into concrete views, we can register the views with the URL conf as usual.
Registering the viewsets with the router is similar to providing a urlpattern. We include two arguments - the URL prefix for the views, and the viewset itself.
127
+
Registering the ViewSets with the router is similar to providing a urlpattern. We include two arguments - the URL prefix for the views, and the view set itself.
124
128
125
-
The `DefaultRouter` class we're using also automatically creates the API root view for us, so we can now delete the `api_root`method from our `views` module.
129
+
The `DefaultRouter` class we're using also automatically creates the API root view for us, so we can now delete the `api_root`function from our `views` module.
126
130
127
-
## Trade-offs between views vs viewsets
131
+
## Trade-offs between views vs ViewSets
128
132
129
-
Using viewsets can be a really useful abstraction. It helps ensure that URL conventions will be consistent across your API, minimizes the amount of code you need to write, and allows you to concentrate on the interactions and representations your API provides rather than the specifics of the URL conf.
133
+
Using ViewSets can be a really useful abstraction. It helps ensure that URL conventions will be consistent across your API, minimizes the amount of code you need to write, and allows you to concentrate on the interactions and representations your API provides rather than the specifics of the URL conf.
130
134
131
-
That doesn't mean it's always the right approach to take. There's a similar set of trade-offs to consider as when using class-based views instead of functionbased views. Using viewsets is less explicit than building your views individually.
135
+
That doesn't mean it's always the right approach to take. There's a similar set of trade-offs to consider as when using class-based views instead of function-based views. Using ViewSets is less explicit than building your API views individually.
0 commit comments