[英]DRF Serializer doesn't recieve value from request for ManyToMany field
我的模型是
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')]}
我不明白這里有什么問題。 當我在UserInfoSerializer
中將參數更改為read_only=True
,它可以工作,但不會將用戶添加到新的 Chat 對象。
{
"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.objects.add(CustomUser.objects.get(pk=id))
return chat_instance
UPD 2 UserInfoSerializer
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
fields = ['id',]
你能試試這個嗎:
@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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.