多对多

博客围绕Python展开,介绍了多对多关系的增删改查操作,包括手动对表操作,还提及使用Serializer序列化器和ModelSerializer添加数据,且指出views视图与serializer操作类似。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多对多增删改查

models.py

from django.db import models

class Role(models.Model):
    """
    角色表
    """
    role_name = models.CharField(max_length=32, unique=True)

    class Meta:
        db_table = "pp_role"

class User(models.Model):
    """
    用户表
    """
    username = models.CharField(max_length=32, verbose_name="姓名")
    age = models.IntegerField(verbose_name="年龄")
    home = models.CharField(verbose_name="家乡", null=True, max_length=32)
    hight = models.IntegerField(verbose_name="身高", null=True)

    # 多对多
    roles = models.ManyToManyField(Role)

    class Meta:
        db_table = "pp_user"

手动对表操作

class ManyToManyTeest(APIView):
    def get(self, request):
        u_id = request.query_params.get('u_id')
        r_id = request.query_params.get('r_id')

        if not all([u_id, r_id]):
            return Response({'code': 400, 'msg': '参数不完整'})

        # 正向  在建⽴manytomany的models⾥查数据
        # user_obj = User.objects.get(id=u_id)
        # role_obj = user_obj.roles.all()
        # ser_obj = RoleSerializer(role_obj, many=True)
        # 反向:在未建⽴manytomany的models⾥查数据
        role_obj = Role.objects.get(id=r_id)
        user_obj = role_obj.user_set.all()
        ser_obj = UserSerializer(user_obj, many=True)

        return Response({'code': 200, 'data': ser_obj.data})

    def post(self, request):
        u_name = request.query_params.get('u_name')
        r_name = request.query_params.get('r_name')

        if not all([u_name, r_name]):
            return Response({'code': 400, 'msg': '参数不完整'})

        # 正向  在建⽴manytomany的models⾥添加数据,(⼀条,⼀个对象)
        user_obj = User.objects.filter(username=u_name).first()
        role_obj = Role.objects.filter(role_name=r_name).first()
        # user_obj.roles.add(role_obj)
        # 反向  在未建⽴manytomany的models⾥添加数据,(⼀条,⼀个对象)
        user_obj = User.objects.filter(username=u_name)
        role_obj = Role.objects.filter(role_name=r_name).first()
        role_obj.user_set.add(*user_obj)
        return Response({'code': 200, 'data': '添加成功'})

    def put(self, request):
        u_id = request.query_params.get('u_id')
        r_id = request.query_params.get('r_id')

        if not all([u_id, r_id]):
            return Response({'code': 400, 'msg': '参数不完整'})

        # 正向 在建⽴manytomany的models⾥修改数据,参数只能是可迭代对象
        # user_obj = User.objects.filter(id=u_id).first()
        # role_obj = Role.objects.filter(id=r_id)
        # user_obj.roles.set(role_obj)

        # 反向  在未建⽴manytomany的models⾥修改数据,参数只能是可迭代对象
        user_obj = User.objects.filter(id=u_id)
        role_obj = Role.objects.filter(id=r_id).first()
        role_obj.user_set.set(user_obj)
        return Response({'code': 200, 'data': '修改成功'})

    def delete(self, request):
        u_id = request.query_params.get('u_id')
        r_id = request.query_params.get('r_id')

        if not all([u_id, r_id]):
            return Response({'code': 400, 'msg': '参数不完整'})
        # 正向  在建⽴manytomany的models⾥删除数据,(⼀条,⼀个对象)
        user_obj = User.objects.filter(id=u_id).first()
        role_obj = Role.objects.filter(id=r_id).first()
        user_obj.roles.remove(role_obj)

        # 反向  :在未建⽴manytomany的models⾥删除数据,(多条,可迭代对象)
        # user_obj = User.objects.all()
        # role_obj = Role.objects.filter(id=r_id).first()
        # role_obj.user_set.remove(*user_obj)

        return Response({'code': 200, 'data': '删除成功'})

使用Serializer序列化器 添加数据

##############serializer.py##################
class UserSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=32)
    age = serializers.IntegerField()
    home = serializers.CharField(max_length=32, allow_null=True)
    hight = serializers.IntegerField()
    roles = serializers.ListField()

    def create(self, validated_data):
    	# 获取 roles,将多对多关联的数据提取出来
        data = validated_data.pop('roles')
        # 添加其他用户信息
        user_obj = User.objects.create(**validated_data)
        # 查询对应角色对象
        roles_obj = Role.objects.filter(id__in=data)
        # 将角色添加给用户
        user_obj.roles.add(*roles_obj)
        return user_obj
#########################views.py################################
class ManyToManyTest2(APIView):
    def post(self, request):
        ser_obj = UserSerializer(data=request.data)
        ser_obj.is_valid()
        print(ser_obj.errors)
        ser_obj.save()

        return Response({'msg': 'OK'})

使用ModelSerializer添加

views视图同 serializer一样

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值