Сериализатор DRF не получает значение из запроса для многих полей

#python #django #serialization #django-rest-framework

Вопрос:

Моя модель-это

 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']}>
 

В этом случае я получаю ошибку

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

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

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

UPD
Я попытался добавить create() метод, но это не помогло

     def create(self, validated_data):
      users = validated_data.pop('users')
      users = [int(id) for id in users.split(',')]
      chat_instance = ChatRoom.objects.create(name=validated_data.pop('name'))
      for id in users:
          chat_instance.users.add(CustomUser.objects.get(pk=id))
      return chat_instance
 

UPD 2
UserInfoSerializer

 class UserInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = ['id',]
 

Комментарии:

1. Попробуйте добавить таких пользователей в свой сериализатор users = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

2. Вы не предоставили UserInfoSerializer

3. Если я использую users = serializers.PrimaryKeyRelatedField(many=True, read_only=True) , я получил KeyError: 'users' , потому read_only=True что .

4. Может быть, я делаю неправильный запрос, но он не выглядит неправильным. Странно, что сериализатор вообще не видит «пользователей»

Ответ №1:

Проблема решена путем изменения 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)
 

Комментарии:

1. Я также удалил create()