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.