Elementos são chamados "recursos" e fazem parte da URL.
/user
;/order
;/product
Recursos específicos são indicados também na URL depois da URL base do recurso, apontados por sua chave principal.
/user/1/
/product/ws-1243/
Recursos podem estar aninhados.
/user/1/order
: Todos os pedidos do usuário 1./user/1/order/2
: Pedido 2 do usuário 1.Ações sobre os recursos são indicadas pelo verbo HTTP:
GET
: Recupera recursos;POST
: Cria recursos;PUT
: Altera (update) recursos;DELETE
: Apaga recursos;PATCH
: Altera recursos.Base recurso | Recurso específico | |
---|---|---|
GET |
Todos os elementos do recurso | Dados do recurso específico |
Base recurso | Recurso específico | |
---|---|---|
POST |
Cria um recurso novo | Não usado, mas poderia criar um recurso com a cahve indicada |
Base recurso | Recurso específico | |
---|---|---|
PUT |
Não usado | Ataliza o registro inteiro do recurso |
Base recurso | Recurso específico | |
---|---|---|
DELETE |
Não usado, mas poderia apagar todos os recursos | Apaga o recurso |
Base recurso | Recurso específico | |
---|---|---|
PATCH |
Não usado | Atualiza campos específicos do recurso |
GET /user
: Retorna todos os usuários do sistema.POST /order
: Cria um novo pedido.DELETE /user/1/order/2
: Apaga o pedido 2 do usuário 1.
router = DefaultRouter()
router.register(r'base_resource', ModelViewSet)
urlpatterns = router.urls
Onde:
base_resource
: é a URL base de acesso ao recurso;ModelViewSet
: é um ViewSet criado em cima do modelo.Para não precisar criar dois GETS, um POST, um PUT, um PATCH e um DELETE.
ViewSet define as funções para cada um dos verbos dentro do resource:
list(self, request)
create(self, request)
retrieve(self, request, pk=None)
update(self, request, pk=None)
partial_update(self, request, pk=None)
destroy(self, request, pk=None)
Um ModelViewSet aplica as funções acima sobre um Model.
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
Existe ainda ReadOnlyModelViewSet que só define as funções
list()
e retrieve()
.
Serializers definem campos de resultados e sua validação, caso estejam sendo usados como entradas (assim como Forms são usados para validar entradas de dados por forms).
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ('name', 'price')
Vem com um serializador JSON como padrão, mas existem outros:
djangorestframework-yaml
: Serializador/desserializador para YAML.djangorestframework-xml
: Serializador/desserializador para XML.
curl -H 'Accept: application/json; indent=4' \
-u admin:admin123 http://127.0.0.1:8000/users/
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin",
"email": "",
"groups": []
}
]
curl -H 'Accept: application/yaml' \
-u admin:admin123 http://127.0.0.1:8000/users/
count: 1
next: null
previous: null
results:
- email: ''
groups: []
url: http://127.0.0.1:8000/users/1/
username: admin
curl -H 'Accept: application/xml' \
-u jbiason:slowdown http://127.0.0.1:8000/users/
1
http://127.0.0.1:8000/users/1/
admin
(Todos os casos, só foi alterado o header "Accept" no request; nenhuma alteração de código -- com exceção do settings.py para ativar os serializers.)