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.

El método de serialización para establecer el valor de un atributo no funciona en una solicitud POST. Estoy utilizando Django Rest Framework.

Tengo un modelo que tiene un atributo “transaction_id” que es un campo de ID personalizado y su valor debe ser calculado para poder guardarse en la base de datos.

Tengo un modelo:

class Transaction(models.Model):
     field = models.IntegerField(default=0)
     transaction_id = models.UUIDField(unique=True)

Este es el serializador:

class TransactionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Transaction
        fields = '__all__'
        read_only_fields = ['id', 'transaction_id']

    def set_tn_number(self):
        tn_number = "some_string/"
        # Tengo que realizar algunos cálculos para obtener el valor relevante
        tn_number = tn_number + str(10)
        return tn_number

Ahora, en mi método post de la vista, estoy realizando lo siguiente:

def post(self, request):
        serializer = TransactionSerializer(data=request.data)
        if serializer.is_valid():
            serializer.tn_number = serializer.set_tn_number()
            serializer.save()
            message = {'message': "Transacción creada exitosamente"}
            return Response(message, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Pero aún estoy obteniendo un error de integridad:

NOT NULL constraint failed: transactiontransaction.transaction_id

¿Alguien puede ayudarme con esto?

Gracias por su tiempo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el campo transaction_id aún no se está estableciendo correctamente a pesar de haber definido una función en el serializer para calcular su valor. Cuando se guarda una instancia del modelo, Django llamará automáticamente al método create del serializer para crear un nuevo objeto, o al método update para actualizar un objeto existente. Por lo tanto, debes modificar el serializer para incluir el cálculo de transaction_id en los métodos create y update.

    Aquí tienes un ejemplo de cómo modificar el serializer:

    class TransactionSerializer(serializers.ModelSerializer):
        class Meta:
            model = Transaction
            fields = '__all__'
            read_only_fields = ['id', 'transaction_id']
    
        def create(self, validated_data):
            validated_data['transaction_id'] = self.set_tn_number()
            return super().create(validated_data)
    
        def update(self, instance, validated_data):
            instance.field = validated_data.get('field', instance.field)
            instance.transaction_id = self.set_tn_number()
            instance.save()
            return instance
    
        def set_tn_number(self):
            tn_number = "some_string/"
            # realizar cálculos para obtener el valor relevante
            tn_number = tn_number + str(10)
            return tn_number
    

    Con esta modificación, el campo transaction_id debería calcularse y establecerse correctamente cuando se crea o actualiza una nueva instancia de Transaction.

Comments are closed.