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.

Django cómo agregar el usuario actualmente registrado a request.data.

¿Cómo puedo agregar el usuario que ha iniciado sesión actualmente a request.data al realizar una llamada POST para crear un nuevo chat? Intenté agregarlo a request.data pero es un querydict y no se puede modificar.

// models.py

class ChatLog(models.Model):
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
participants = models.ManyToManyField(Profile, related_name=’chatlogs’)

def __str__(self):
    return str(self.id)

class Message(models.Model):
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
chat_log = models.ForeignKey(ChatLog, on_delete=models.CASCADE, related_name=’messages’)
sender = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name=’sentmessages’)
body = models.TextField()
is_read = models.BooleanField(default=False, null=True)
created = models.DateTimeField(auto_now_add=True)

def __str__(self):
    return str(self.id)

class Meta:
    ordering = ['-created']

// views.py

class ChatList(generics.ListCreateAPIView):
serializer_class = ChatSerializer
permission_classes = [permissions.IsAuthenticated]

def get_queryset(self):
    user = self.request.user.profile
    return user.chatlogs.all()

def post(self, request, *args, **kwargs):
    serializer = ChatSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para agregar el usuario actualmente registrado a request.data al realizar una llamada POST para crear un nuevo chat, puedes crear un ChatSerializer personalizado y anular su método create (). De esta manera, puedes modificar request.data antes de que se guarde en la base de datos.

    Aquí tienes un ejemplo de cómo puedes modificar el serializador para agregar el usuario actual a la campo participants en el modelo ChatLog:

    # serializers.py
    from rest_framework import serializers
    
    class ChatSerializer(serializers.ModelSerializer):
        participants = serializers.PrimaryKeyRelatedField(queryset=Profile.objects.all(), many=True)
    
        def create(self, validated_data):
            # agregar el usuario actualmente registrado a la lista de participantes
            user = self.context['request'].user.profile
            validated_data['participants'].append(user)
            return super().create(validated_data)
    
        class Meta:
            model = ChatLog
            fields = ['id', 'participants']
    
    
    # views.py
    class ChatList(generics.ListCreateAPIView):
        serializer_class = ChatSerializer
        permission_classes = [permissions.IsAuthenticated]
    
        def get_queryset(self):
            user = self.request.user.profile
            return user.chatlogs.all()
    
        def post(self, request, *args, **kwargs):
            serializer = ChatSerializer(data=request.data, context={'request': request})
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

    En el ejemplo anterior, estamos creando un ChatSerializer personalizado con un método create () modificado que agrega el usuario actual al campo participants en los datos validados. También estamos pasando el objeto de solicitud al contexto del serializador, al que podemos acceder más tarde desde el serializador.

    En el método post de la vista ChatList, estamos creando una instancia de ChatSerializer y pasando el objeto de solicitud a su contexto. Esto nos permite acceder al usuario actualmente registrado desde el serializador.

    Con estas modificaciones, cuando envías una solicitud POST para crear un nuevo chat, el usuario actualmente registrado se agregará automáticamente al campo participants en los datos de la solicitud, y estos datos modificados se guardarán en la base de datos.

Comments are closed.