Usando serializers diferentes para uma mesma ModelViewSet do Django Rest Framework

Hudson Brendon
Jun 12 · 2 min read

Em alguns momentos no desenvolvimento de APIs, nos deparamos com situações onde precisamos utilizar serializers diferentes. Por exemplo, em uma ViewSet onde temos uma listagem mais detalhada dos objetos, mostrando por exemplo todas as informações dos objetos que se relacionam com a instância em questão e uma ação que utiliza o método POST ou UPDATE onde é recebido as informações desses objetos apenas por ID. Precisamos definir que um ou outro serializer será usado.

Indo para prática

Para melhor exemplificar, imagine um modelo como o apresentado abaixo:

O modelo acima tem relação com o modelo de usuários:

E com o modelo de bancos:

Se baseando no modelo de contrato, teriamos os seguintes serializers:

E o serializer de criação:

Note que diferentemente do primeiro, o segundo serialializer trás os campos de client e bank serializados nele mesmo.

Com os modelos e os serializers prontos, é hora de construir-mos a ViewSet que ficará dessa forma:

Note que setamos o ContractSerializer no serializer_class da ViewSet. Esse serializer será usado como padrão em todas as requisições a essa view, sejam elas GET, POST, UPDATE ou DELETE.

E se quiséssemos utilizar esse serializer apenas para listagens podendo com isso visualizar todos os dados (inclusive os dados dos objetos que tem relação com ele) e o ContractCreateSerializar para as demais operações?

A classe de ModelViewSet que herdamos, disponibiliza um método chamado get_serializer_class no qual podemos alterar, e fazer com que as ações que utilizam o método GET, usem o ContractSerializer. E as ações que utilizem os métodos POST e UPDATE utilizem o ContractCreateSerializer, a resolução disso se encontra no código abaixo:

Simples né?

Como visto aqui, é bem simples trabalhar com serializers diferentes no Django Rest Framework. Nos próximos posts irei trazer outros tipos de implementações utilizando os demais recursos que o framework tem a oferecer como sistema de roteamento, paginação, filtro, cache, etc. Até a próxima.