Сериализатор DRF не получает значение из запроса для поля ManyToMany

Моя модель -

class ChatRoom(models.Model):
    name = models.CharField(max_length=55, verbose_name='Имя чата', unique=True)
    users = models.ManyToManyField(
        CustomUser, 
        verbose_name='Пользователи', 
        related_name='user_chatrooms', 
        null=True
    )

Мой сериализатор для этой модели

class ChatRoomSerializer(serializers.ModelSerializer):
    users = UserInfoSerializer(many=True, read_only=False)
    class Meta:
        model = ChatRoom
        fields = [
            'name',
            'users'
        ]

Вид выглядит

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def api_create_chat(request):
    if request.method == 'POST':
        serializer = ChatRoomSerializer(data=request.data)
        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)

Я прошу (здесь тело)

<QueryDict: {'name': ['benny'], 'users': ['11,1']}>

В этом случае я получаю Error

{'users': [ErrorDetail(string='This field is required.', code='required')]}

И я не могу понять, что здесь не так. Когда я меняю параметр на read_only=True в UserInfoSerializer он работает, но не добавляет пользователя в новый объект Chat.

{
    "name": "benny",
    "users": []
}

Можете попробовать так:

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def api_create_chat(request):
    if request.method == 'POST':
        data = {'name': request.data.get('name'), 'users': request.data.get('users')}
        serializer = ChatRoomSerializer(data=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)

Проблема решена путем изменения serializer в view.py. Это не очень хорошее решение, но оно работает.

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def api_create_chat(request):
    if request.method == 'POST':
        serializer = ChatRoomSerializer(data=request.data)
        data = {}
        if serializer.is_valid():
            serializer.save()
            users_id = [int(id) for id in request.data['users'].split(',')]
            chat = ChatRoom.objects.get(pk=serializer.data['id'])
            for id in users_id:
                user = CustomUser.objects.get(pk=id)
                chat.users.add(user)
                serializer.data['users'].append({'user': user.id, 'username': user.username})
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Вернуться на верх