Сериализатор 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)