簡體   English   中英

DRF Serializer 不會從 ManyToMany 字段的請求中收到值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM