Skip to content

Commit 8262298

Browse files
committed
Django Rest Framework - #3 Class Based Views
1 parent 3e1c7a6 commit 8262298

File tree

1 file changed

+155
-0
lines changed

1 file changed

+155
-0
lines changed
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
title: Django Rest Framework - #3 Class Based Views
2+
Slug: django-rest-framework-class-based-views
3+
Date: 2018-02-15 23:00
4+
Tags: Python, Django, REST
5+
Author: Regis da Silva
6+
7+
Github: rg3915
8+
Twitter: rg3915
9+
Category: Python, Django, REST
10+
11+
* 0 - [Quickstart][10]
12+
* 1 - [Serialization][11]
13+
* 2 - [Requests & Responses][12]
14+
* 3 - **Class based views**
15+
16+
Este post é continuação do post [Django Rest Framework Requests & Responses][12].
17+
18+
Finalmente chegamos as views baseadas em classes. A grande vantagem é que com poucas linhas de código já temos nossa API pronta.
19+
20+
Veja como fica a [views.py](https://github.com/rg3915/drf/blob/b0aa989ffc756e6dc5f65e172dfb43d47127d743/core/views.py):
21+
22+
```python
23+
from django.http import Http404
24+
from rest_framework.views import APIView
25+
from rest_framework.response import Response
26+
from rest_framework import status
27+
from core.models import Person
28+
from core.serializers import PersonSerializer
29+
30+
31+
class PersonList(APIView):
32+
"""
33+
List all persons, or create a new person.
34+
"""
35+
36+
def get(self, request, format=None):
37+
persons = Person.objects.all()
38+
serializer = PersonSerializer(persons, many=True)
39+
return Response(serializer.data)
40+
41+
def post(self, request, format=None):
42+
serializer = PersonSerializer(data=request.data)
43+
if serializer.is_valid():
44+
serializer.save()
45+
return Response(serializer.data, status=status.HTTP_201_CREATED)
46+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
47+
48+
49+
class PersonDetail(APIView):
50+
"""
51+
Retrieve, update or delete a person instance.
52+
"""
53+
54+
def get_object(self, pk):
55+
try:
56+
return Person.objects.get(pk=pk)
57+
except Person.DoesNotExist:
58+
raise Http404
59+
60+
def get(self, request, pk, format=None):
61+
person = self.get_object(pk)
62+
serializer = PersonSerializer(person)
63+
return Response(serializer.data)
64+
65+
def put(self, request, pk, format=None):
66+
person = self.get_object(pk)
67+
serializer = PersonSerializer(person, data=request.data)
68+
if serializer.is_valid():
69+
serializer.save()
70+
return Response(serializer.data)
71+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
72+
73+
def delete(self, request, pk, format=None):
74+
person = self.get_object(pk)
75+
person.delete()
76+
return Response(status=status.HTTP_204_NO_CONTENT)
77+
```
78+
79+
E `urls.py`:
80+
81+
```python
82+
urlpatterns = [
83+
path('persons/', views.PersonList.as_view()),
84+
path('persons/<int:pk>/', views.PersonDetail.as_view()),
85+
]
86+
```
87+
88+
## Usando Mixins
89+
90+
Repare que no exemplo anterior tivemos que definir os métodos `get()`, `post()`, `put()` e `delete()`. Podemos reduzir ainda mais esse código com o uso de mixins.
91+
92+
```python
93+
from rest_framework import mixins
94+
from rest_framework import generics
95+
from core.models import Person
96+
from core.serializers import PersonSerializer
97+
98+
99+
class PersonList(mixins.ListModelMixin,
100+
mixins.CreateModelMixin,
101+
generics.GenericAPIView):
102+
queryset = Person.objects.all()
103+
serializer_class = PersonSerializer
104+
105+
def get(self, request, *args, **kwargs):
106+
return self.list(request, *args, **kwargs)
107+
108+
def post(self, request, *args, **kwargs):
109+
return self.create(request, *args, **kwargs)
110+
111+
112+
class PersonDetail(mixins.RetrieveModelMixin,
113+
mixins.UpdateModelMixin,
114+
mixins.DestroyModelMixin,
115+
generics.GenericAPIView):
116+
queryset = Person.objects.all()
117+
serializer_class = PersonSerializer
118+
119+
def get(self, request, *args, **kwargs):
120+
return self.retrieve(request, *args, **kwargs)
121+
122+
def put(self, request, *args, **kwargs):
123+
return self.update(request, *args, **kwargs)
124+
125+
def delete(self, request, *args, **kwargs):
126+
return self.destroy(request, *args, **kwargs)
127+
```
128+
129+
## Usando generic class-based views
130+
131+
E para finalizar usamos `ListCreateAPIView` e `RetrieveUpdateDestroyAPIView` que já tem todos os métodos embutidos.
132+
133+
```python
134+
from rest_framework import generics
135+
from core.models import Person
136+
from core.serializers import PersonSerializer
137+
138+
139+
class PersonList(generics.ListCreateAPIView):
140+
queryset = Person.objects.all()
141+
serializer_class = PersonSerializer
142+
143+
144+
class PersonDetail(generics.RetrieveUpdateDestroyAPIView):
145+
queryset = Person.objects.all()
146+
serializer_class = PersonSerializer
147+
```
148+
149+
Versão final de [views.py](https://github.com/rg3915/drf/blob/263ca63e5c8e2dd2e0f5d6c88c5733fcfdab4f74/core/views.py).
150+
151+
Abraços.
152+
153+
[10]: http://pythonclub.com.br/django-rest-framework-quickstart.html
154+
[11]: http://pythonclub.com.br/django-rest-framework-serialization.html
155+
[12]: http://pythonclub.com.br/django-rest-framework-requests-responses.html

0 commit comments

Comments
 (0)