多对多表添加修改以及序列化器

views.py:

class UserAddView(APIView):
    def post(self, request):
        data = request.data
        user_ser = UserSer(data=data)
        if user_ser.is_valid():
            user_ser.save()
            return Response(user_ser.data)
        else:
            return Response({'msg': '数据不合法'})
    
    def put(self, request):
        uid = request.data.get('id')
        print(request.data)
        user_obj = User.objects.filter(pk=uid).first()
        ser_obj = UserSer(instance=user_obj, data=request.data)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response({'msg': '修改成功', 'data': request.data})
        print(ser_obj.errors)
        return Response({'msg': '数据不合法'})

serializers.py

class UserSer(serializers.Serializer):
    username = serializers.CharField(max_length=64)
    age = serializers.IntegerField()
    home = serializers.CharField(max_length=64)
    hight = serializers.CharField(max_length=64)
    # classrooms = serializers.PrimaryKeyRelatedField(read_only=True)   # 展示id
    # classrooms = serializers.StringRelatedField(read_only=True)   # 展示名称
    # classrooms = ClassroomSer(read_only=True)   # 展示全部数据
    classrooms = serializers.IntegerField(write_only=True)  # 只允许写操作
    roles = serializers.ListField(write_only=True)	# 因为可以写入多个角色,所以要使用ListField

    def create(self, validated_data):
        # 获取一对多表的外键
        id = validated_data.pop("classrooms")
        # 获取多对多的对应关系
        roles_list = validated_data.pop("roles")
        # 创建user表信息,并带上外键
        user_obj = User.objects.create(classrooms_id=id, **validated_data)
        # 查询出符合规范的角色信息
        role_obj = Role.objects.filter(id__in=roles_list)
        # 往第三张表添加数据
        user_obj.roles.add(*role_obj)
        return user_obj
        
    def update(self, instance, validated_data):
        instance.username = validated_data.get('username', instance.username)
        instance.age = validated_data.get('age', instance.age)
        instance.home = validated_data.get('home', instance.home)
        instance.hight = validated_data.get('hight', instance.hight)
        instance.classrooms_id = validated_data.get('classrooms',instance.classrooms_id)

        user_obj = User.objects.get(id=instance.id)
        role_obj = Role.objects.filter(id__in=validated_data['roles'])
        user_obj.roles.set(role_obj)
        instance.save()
        return instance

版权声明:本文为weixin_44870612原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。