DRF создает экземпляр с вложенным сериализатором, вызывая исключение на serializer.is_valid

Контекстуализация

У меня есть следующий сериализатор, который имеет вложенный сериализатор для возврата имени пользователя вместо id

    class RoomSerializer(serializers.ModelSerializer):
        participants = ParticipantSerializer(many=True) # Nested serializer
    
        class Meta:
            model = Room
            fields = '__all__'

I crated the following ListView under this url => `localhost:8000/api/rooms/<username>/`


class RoomList(generics.ListCreateAPIView):
    serializer_class = RoomSerializer

    def get_queryset(self):
        return Room.objects.filter(participants__username=self.kwargs['username'])

    def create(self, request, *args, **kwargs):
        print(request.data)
        return super().create(request, *args, **kwargs)

Первый выпуск

Первое, что произошло - я отправил следующие данные

data = {
    'participants': ['foo', 'foo1']
}

и вернул ошибку 400 со следующими данными

{"participants": [
        {"non_field_errors": ["Invalid data. Expected a dictionary, but got str."]},
        {"non_field_errors": ["Invalid data. Expected a dictionary, but got str."]}
    ]
}

Поэтому я изменил данные запроса, чтобы выглядели как полезная нагрузка, когда я делаю запрос get к этой конечной точке.

data = {
    'participants': [
        {username: 'foo'},
        {username: 'foo2'},
    ]
}

Второй вопрос

По-прежнему возвращается код 400 с этим ответом.

{"participants": [
        {"username": ["A user with that username already exists."]},
        {"username": ["A user with that username already exists."]}
    ]
}

что мне нужно

На 'GET' мне нужен список всех комнат, участником которых является пользователь, и каждая комната должна иметь список с именем пользователя (здесь необходим вложенный сериализатор, потому что без него список составлялся по id)

В 'POST' мне нужно создать новую комнату, единственное поле, которое требуется, это участник, для этого поста я помещу модель комнаты ниже.

class Room(models.Model):
    room_name = models.CharField(max_length=28, blank=True, null=True)
    participants = models.ManyToManyField(CustomUser)
    messages = models.ManyToManyField(Message, blank=True)
    is_group = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.pk)
Вернуться на верх