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.

“Este campo es requerido.” en los serializadores de Django Rest Framework

Me enfrento a un problema en los serializadores DRF. Tengo un modelo llamado Issue que tiene una clave externa del modelo User para guardar el usuario que ha creado el problema en particular. Ahora bien, la solicitud GET funciona correctamente y obtengo los problemas perfectamente con el nombre de usuario que ha creado el problema, pero cuando hago la solicitud POST obtengo el error en el campo “created_by” que dice “Este campo es obligatorio” aunque estoy proporcionando este campo.

A continuación se muestra mi código:

Modelo

class Issues(models.Model):
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='issue_created_by')
    title = models.CharField(max_length=225, default='', null=False)
    details = models.CharField(max_length=1000, default='')
    created_on = models.DateField(default=timezone.now)
    tags = models.CharField(max_length=225, blank=True, null=True, default='')

<code>
Serializador de Issue
</code>
class IssueSerializer(serializers.ModelSerializer):
    created_by = UserSerializer()

    class Meta:
        model = Issues
        fields = ['created_by', 'title', 'details', 'created_on', 'tags']

<code>
Serializador de Usuario
</code>
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'email', 'password']
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        user = super().create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return True

views.py

class IssueView(viewsets.ViewSet):

    def create(self, request):
        serialized_issues = IssueSerializer(data=request.data)
        if serialized_issues.is_valid():
            serialized_issues.save()
            return Response({'message': 'Issue Created', 'status': status.HTTP_200_OK})
        else:
            return Response({'error': serialized_issues.errors, 'status': status.HTTP_400_BAD_REQUEST})

    def list(self, request):
        all_issues = Issues.objects.all()
        serialized_issues = IssueSerializer(all_issues, many=True)
        return Response(serialized_issues.data)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema en el código se encuentra en IssueSerializer, donde el campo created_by no está marcado como campo read_only. Por lo tanto, el serializador espera un valor para el campo created_by durante la creación de un nuevo problema, y como no se proporciona, muestra el error “Este campo es requerido”.

    Para solucionar este problema, agregue read_only=True al campo created_by en la clase IssueSerializer. Esto permitirá que el campo created_by sea de solo lectura durante la creación de un nuevo problema y se rellene automáticamente según el usuario que ha iniciado sesión.

    El código actualizado para la clase IssueSerializer sería:

    class IssueSerializer(serializers.ModelSerializer):
        created_by = UserSerializer(read_only=True)
    
        class Meta:
            model = Issues
            fields = ['created_by', 'title', 'details', 'created_on', 'tags']
    

    Con este cambio, el campo created_by será ahora de solo lectura y se rellenará automáticamente según el usuario que ha iniciado sesión durante la creación de un nuevo problema.

Comments are closed.