Searilizer в Django Rest framework не работает так, как ожидалось

Ниже перечислены мои перлизаторы:

class MessageSearlizer(serializers.ModelSerializer):
    
        class Meta:
            model = Message
            fields = "__all__"  

#This isnt working as expected
class ChatSearilizer(serializers.ModelSerializer):
    messages: MessageSearlizer(many=True)
    first_participant: serializers.SerializerMethodField()
    second_participant: serializers.SerializerMethodField(
    )

    def get_first_participant(self, obj):
        return {
            "id": obj.first_participant.pk,
            "name": obj.first_participant.name,
            "photo": obj.first_participant.photo.file.url,
        }

    def get_second_participant(self, obj):
        return {
            "id": obj.second_participant.pk,
            "name": obj.second_participant.name,
            "photo": obj.second_participant.photo.file.url,
        }

    class Meta:
        model = Chat
        fields = "__all__"

Ниже приведены мои модели:

class Chat(models.Model):
    first_participant = models.ForeignKey(
        Profile, on_delete=models.CASCADE, related_name="first_participant")
    second_participant = models.ForeignKey(
        Profile, on_delete=models.CASCADE, related_name="second_participant")
    date_modified = models.DateTimeField(auto_now=True)


class Message(models.Model):
    chat = models.ForeignKey(Chat, on_delete=models.CASCADE)
    sender = models.ForeignKey(
        to=Profile, on_delete=models.CASCADE, related_name="sender", null=True)  # This null is temporary will remove it
    receiver = models.ForeignKey(
        to=Profile, on_delete=models.CASCADE, related_name="receiver", null=True)  # This null is temporary will remove it
    text = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)

      
    def __str__(self):
        return self.text

    class Meta:
        ordering = ["timestamp"]

Ниже приведены мнения:

class UserChats(generics.ListAPIView):

    serializer_class = ChatSearilizer

    # get all the chats in which user is involved
    def get_queryset(self):
        return Chat.objects.filter(Q(first_participant=self.request.user.profile) | 
        Q(second_participant=self.request.user.profile))


class ChatDetail(generics.RetrieveAPIView):
    serializer_class = ChatSearilizer

    def get_queryset(self):
        return Chat.objects.filter(pk=self.kwargs.get('pk'))

class SendMessageView(generics.CreateAPIView):

    serializer_class = ChatSearilizer

    def post(self, request, *args, **kwargs):

        new_request = request
        chat_id = new_request.data["chat_id"]
        text = new_request.data["text"]
        sender = self.request.user.profile.pk
        receiver = new_request.data["receiver"]

        # check if chat_id is present in request body
        if chat_id:

            try:
                chat = Chat.objects.get(pk=chat_id)

                data = {"chat": chat.pk, "text": text,
                        "sender": sender, "receiver": receiver}

                return create_message(data)

            except ObjectDoesNotExist:
                return json_response(status=400, data={
                    "error": "invalid chat id provided"})

        # if chat id is not present check if chat between the sender and receiver already exists
        try:
            chat = Chat.objects.get(Q(first_participant=sender, second_participant=receiver) | Q(
                first_participant=receiver, second_participant=sender))

            data = {"chat": chat.pk, "text": text,
                    "sender": sender, "receiver": receiver}

            return create_message(data)

        except ObjectDoesNotExist:
            # chat does not exist so create new chat
            searlizer = ChatSearilizer(
                data={"first_participant": sender, "second_participant": receiver})
            if searlizer.is_valid():
                chat = searlizer.save()

                data = {"chat": chat.pk, "text": text,
                        "sender": sender, "receiver": receiver}

                return create_message(data)

            return Response(searlizer.errors, status=status.HTTP_400_BAD_REQUEST)


def create_message(data):
    sr = MessageSearlizer(data=data)
    if sr.is_valid():
        sr.save()
        return json_response(status=200, data=sr.data)

    return Response(sr.errors, status=status.HTTP_400_BAD_REQUEST)

Не работает перлизатор чата, мне нужен массив сообщений в чате, но этого массива нет. Также не работают методы получения фейлов. Я просто получаю простые идентификаторы первого участника и второго участника. Кода стало слишком много в этом вопросе, но я чувствую, что все это важно для понимания. Заранее спасибо

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