1.model.py
1 from django.db import models 2 3 # Create your models here. 4 5 class Role(models.Model): 6 role_name = models.CharField(max_length=30,verbose_name="角色名称",unique=True) 7 class Meta: 8 db_table='角色' 9 10 class Classroom(models.Model): 11 class_name = models.CharField(max_length=50,verbose_name="班级名称",unique=True) 12 13 class Mate: 14 db_table="班级" 15 16 def __str__(self): # 查询数据是能显示出来相关的名称 17 return self.class_name 18 19 class User(models.Model): 20 username = models.CharField(max_length=40) 21 age = models.CharField(max_length=30) 22 #多对多 23 role = models.ManyToManyField(Role) 24 #一对多 25 classroom = models.ForeignKey(Classroom,on_delete=models.CASCADE,null=True) 26 class Mate: 27 db_table ="用户"
2.
1 from .models import * 2 from rest_framework.serializers import ModelSerializer 3 from rest_framework import serializers 4 5 class UserSer(serializers.ModelSerializer): 6 class Meta: 7 model = User 8 fields = '__all__' 9 depth = 1 # 查询时可以把全部外键的字段显示出来 10 # 添加 也就是反序列化是 不能使用 否则报错 11 12 13 14 class RoleSer(serializers.ModelSerializer): 15 class Meta: 16 model = Role 17 fields = '__all__'
3.view.py
1 from rest_framework.views import APIView,Response 2 from django.views import View 3 from .serislizer import * 4 from .models import * 5 6 7 8 class RoleView(APIView): 9 def get(self,request): 10 # 获取数据 11 u_id = request.query_params.get('u_id') 12 r_id = request.query_params.get('r_id') 13 # 验证 数据 14 if not all([u_id,r_id]): 15 return Response({'code':401,'msg':'参数不全'}) 16 # 逻辑入库 17 #1 通过用户的查询 角色 序列化的是角色 18 user_obj = User.objects.get(id=u_id) 19 role_obj = user_obj.role.all() 20 ser_obj = RoleSer(role_obj,many=True) 21 # 2 通过角色 也就是外键来查询 用户的角色 所谓的反查询 22 # role_obj = Role.objects.get(id=r_id) 23 # user_obj = role_obj.user_set.all() 24 # ser_obj = UserSer(user_obj,many=True) 25 # 返回数据 26 data = ser_obj.data 27 return Response({'data':data,'code':200}) 28 29 def post(self,request): 30 #获取数据 31 r_name = request.data.get('r_name') 32 u_name = request.data.get('u_name') 33 #验证 34 if not all([u_name,r_name]): 35 return Response({'code':400,'msg':'参数不全'}) 36 #逻辑入库 37 # 正想操作 38 user_obj = User.objects.get(username=u_name) 39 role_obj = Role.objects.get(role_name=r_name) 40 user_obj.role.add(role_obj) 41 # # 反向操作 42 # role_obj = Role.objects.get(role_name=r_name) 43 # user_obj = User.objects.filter(username=u_name) #加first的话不用* 也就是名字一样俩个用户同时添加角色时加* 44 # role_obj.user_set.add(*user_obj) # 如果返回的是列表或者all全部就用* 45 #返回数据 46 return Response({'code':200,'data':'添加成功'}) 47 48 def put(self, request): 49 # 获取数据 50 r_name = request.data.get('r_name') 51 u_name = request.data.get('u_name') 52 # 验证 53 if not all([u_name, r_name]): 54 return Response({'code': 400, 'msg': '参数不全'}) 55 # 逻辑入库 56 user_obj = User.objects.get(username=u_name) 57 role_obj = Role.objects.filter(role_name=r_name) #多对多必须用filter过滤出来 get只能获取一个 58 user_obj.role.set(role_obj) # 多对多 用set 修改 59 60 return Response({'msg': '修改成功', 'code': 200}) 61 62 def delete(self, request): 63 # 获取数据 64 r_name = request.data.get('r_name') 65 u_name = request.data.get('u_name') 66 # 验证 67 if not all([u_name, r_name]): 68 return Response({'code': 400, 'msg': '参数不全'}) 69 # 逻辑入库 70 user_obj = User.objects.get(username=u_name) 71 role_obj = Role.objects.get(role_name=r_name) #多对多删除 时必须要具体对象 所以要用get 72 user_obj.role.remove(role_obj) #多对多删除 用 remove 73 return Response({'msg': '删除成功', 'code': 200})
4.urls.py
from django.urls import path,re_path from . import views urlpatterns = [ path("R/", views.RoleView.as_view()), ]
浙公网安备 33010602011771号