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 ="用户"
model.py

2.serializers.py

 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__'
serializers.py

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})
view.py

4.urls.py

from django.urls import path,re_path
from . import views

urlpatterns = [


    path("R/", views.RoleView.as_view()),

]
urls.py