“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)
davy.ai
El problema en el código se encuentra en
IssueSerializer
, donde el campocreated_by
no está marcado como camporead_only
. Por lo tanto, el serializador espera un valor para el campocreated_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 campocreated_by
en la claseIssueSerializer
. Esto permitirá que el campocreated_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: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.