Saltar al contenido

Django REST Framework: “Este campo es obligatorio”. con requerido=Falso y únicos_juntos

Te damos la contestación a este apuro, o por lo menos eso esperamos. Si presentas dudas coméntalo y con gusto te responderemos

Solución:

Tuve un problema similar y lo resolví creando y pasando explícitamente una nueva instancia al serializador. En el UserVoteViewSet tienes que sustituir perform_create con create:

 def create(self, request, *args, **kwargs):
    uv = UserVote(created_by=self.request.user)
    serializer = self.serializer_class(uv, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Pude resolver esto con una sola línea en views.py

def create(self, request, *args, **kwargs):
    request.data.update('created_by': request.user.id)
    return super(UserVoteViewSet, self).create(request, *args, **kwargs)

Dado que esta vista espera que el usuario sea autenticado, no olvide extender permission_classes por rest_framework.permissions.IsAuthenticated

La otra forma extraña que puedes hacer es usar señales como esta

@receiver(pre_save, sender=UserVote)
def intercept_UserVote(sender, instance, *args, **kwargs):
    import inspect
    for frame_record in inspect.stack():
        if frame_record[3]=='get_response':
            request = frame_record[0].f_locals['request']
            break
    else:
        request = None

    instance.pre_save(request)

Entonces básicamente puedes definir pre_save en tu modelo

def pre_save(self, request):
    # do some other stuff
    # Although it shouldn't happen but handle the case if request is None
    self.created_by = request.user

La ventaja de este sistema es que puede usar el mismo bit de código para cada modelo. Si necesita cambiar algo, simplemente cambie en pre_save(). También puedes agregar más cosas

Finalizando este artículo puedes encontrar los informes de otros sys admins, tú además tienes la libertad de dejar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *