多对多增删改查
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__'