es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

generando hash de datos en los serializadores de Django Rest Framework

Quiero realizar un hash SHA256 de algunos campos en mi serializador y asignarlo a otro campo en el mismo serializador, este es mi modelo:

class Something(models.Model):
    x = models.CharField(max_length=300)
    y = models.IntegerField()
    z = models.IntegerField()
    f = models.IntegerField()
    hash = models.CharField(max_length=300)

El usuario primero define x, y, z y f. Después de eso, necesito generar automáticamente el hash de la siguiente manera:

hash = x + y + z + f

Mi serializador:

class SomethingSerializers(serializers.ModelSerializer):
    class Meta:
        model = Something
        fields = ['x', 'y', 'z', 'f', 'hash']

¿Cuál es la mejor decisión?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La mejor decisión sería anular el método create del serializador para calcular el hash SHA256 de los campos x, y, z y f, y luego establecer el campo hash en el valor de hash calculado. Aquí tienes un ejemplo de implementación:

    from hashlib import sha256
    
    class SomethingSerializer(serializers.ModelSerializer):
        class Meta:
            model = Something
            fields = ['x', 'y', 'z', 'f', 'hash']
    
        def create(self, validated_data):
            # Extrae los valores de x, y, z y f de los datos validados
            x = validated_data['x']
            y = validated_data['y']
            z = validated_data['z']
            f = validated_data['f']
    
            # Concatena los valores de x, y, z y f
            concatenado = f"{x}{y}{z}{f}"
    
            # Calcula el hash SHA256 de la cadena concatenada
            hash_calculado = sha256(concatenado.encode('utf-8')).hexdigest()
    
            # Agrega el valor de hash calculado a los datos validados
            validated_data['hash'] = hash_calculado
    
            # Crea y devuelve la instancia de Something utilizando los datos validados modificados
            return super().create(validated_data)
    

    En esta implementación, anulamos el método create del serializador para extraer los valores de x, y, z y f de los datos validados. Luego concatenamos estos valores y calculamos el hash SHA256 de la cadena resultante. Finalmente, agregamos el valor de hash calculado a los datos validados y llamamos al método create de la clase de serializador padre para crear la instancia de Something. Esto asegura que el campo hash se establezca automáticamente en el valor correcto cuando se crea una nueva instancia de Something utilizando el serializador.

Comments are closed.