#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()