Skip to content

Instantly share code, notes, and snippets.

@mrroot5
Created May 14, 2020 11:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrroot5/9db138242c9c1c8d937a09ab66c0bd7e to your computer and use it in GitHub Desktop.
Save mrroot5/9db138242c9c1c8d937a09ab66c0bd7e to your computer and use it in GitHub Desktop.
Obtener request method con Django Rest Framework desde un serializaer. Keywords: drf, drf serializers, drf request method, drf requests method, django rest framework, django rest framework serializers, django rest framework request method, django rest framework requests method

Intro

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.

Obtener request method serializer en is_valid

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment