Django как добавить текущего вошедшего пользователя в request.data

Как добавить текущего зарегистрированного пользователя в request.data при выполнении post вызова для создания нового чата. Я пытался добавить его в request.data, но он является querydict и неизменяем. // 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)

У ListCreateAPIView специально есть метод perform_create, который вы можете переопределить . По умолчанию он просто делает:

def perform_create(self, serializer):
    serializer.save()

Вы можете переопределить это, чтобы добавить дополнительные данные к serializer, например:

def perform_create(self, serializer):
    serializer.save(sender=self.request.user)

Избавьтесь от вашего метода post, вы просто переопределяете и повторяете автоматику, для которой вы используете общие представления в первую очередь.

Вернуться на верх