El objetivo de este snippet es obtener el request method en un serializer de Django Rest Framework.
A modo didáctico usaremos de ejemplo el método is_valid del serializer.
Asumiremos que usamos el model serializer porque suele ser muy usado,
pero vale con cualquier otro is_valid
se encuentra también en el serializer base.
Manos a la obra.
models.py
from django.db import models
class Artista(models.Model):
nombre = models.CharField(max_length=50, blank=true, null=true)
apellidos = models.CharField(max_length=150, blank=true, null=true)
instrumento = models.CharField(max_length=100)
serializers.py
from rest_framework import serializers
class ArtistaSerializer(serializers.ModelSerializer):
def is_valid(self, raise_exception=False):
# Obtenemos el resquest del contexto de la peticion
drf_request = self.context.get('request')
# Comprobamos que la propiedad method exista
if hasattr(drf_request, 'method')
# De existir convertimos a minusculas para poder comprobar que metodo usamos
metodo_peticion = drf_request.method.lower()
if metodo_peticion == 'post':
print("Soy un POST")
elif metodo_peticion == 'put':
print("Soy un PUT")
elif metodo_peticion == 'patch':
print("Soy un PATCH")
return super().is_valid(raise_exception)
# Version Python 2:
# return super(ArtistaSerializer, self).is_valid(raise_exception)
Extra tip: podemos aprovechar el ejemplo anterior para hacer algo con algún dato. En nuestro modelo tanto el nombre como los apellidos del artita son opcionales. Imaginemos que queremos que si se introduce un nombre al crear un nuevo artista se requieran también los apellidos.
Basta de hablar, veamos un ejemplo. En este caso omitiré los comentarios del punto anterior y aplicaré el cambio solamente al POST por simplicidad.
from rest_framework import serializers
class ArtistaSerializer(serializers.ModelSerializer):
def is_valid(self, raise_exception=False):
drf_request = self.context.get('request')
if hasattr(drf_request, 'method')
metodo_peticion = drf_request.method.lower()
if metodo_peticion == 'post':
# Obtenemos el nombre.
post_nombre = self.initial_data.get('nombre')
post_apellidos = self.initial_data.get('apellidos')
# Comprobamos que el nombre no este vacio y que apellidos esta vacio
if post_nombre and not post_apellidos:
# Obtenemos el mensaje de error del campo apellidos cuando es requerido.
# Esto es muy util si usamos traducciones ya que los mensajes de error podrian cambiar
error_msg = self.fields.fields.get('apellidos').error_messages.get('required')
if not error_msg:
# Si no hay un mensaje de error "personalizado" para dicho campo mostramos el generico.
error_msg = self.error_messages.get('required')
# Como hemos detectado un error, lo devolvemos
raise serializers.ValidationError({'nombre': error_msg})
return super().is_valid(raise_exception)
# Version Python 2:
# return super(ArtistaSerializer, self).is_valid(raise_exception)
Listo, ahora tenemos un ejemplo funcional de la utilidad de saber el metodo que usamos.