一个部门下面可能会有很多子部门,一个子部门上面可能会有父部门;即部门内部之间进行关联,称为树形的关联结构
关联自己用self
部门与用户的关系为一对多
class DeptModel(BaseModel):
"""
todo 用户所在部门的模型
一个部门下面可能会有很多子部门,一个子部门上面可能会有父部门;即部门内部之间进行关联,称为树形的关联结构
关联自己用self
"""
name = models.CharField('部门名称', unique=True, max_length=20)
address = models.CharField('部门所在地址', null=True, blank=True, max_length=256)
parent = models.ForeignKey('self',
null=True,
blank=True,
related_name='chlidren',
on_delete=models.CASCADE,
verbose_name='部门所在的父部门')
def __str__(self):
return self.name
class Meta:
db_table = 't_dept'
verbose_name = '部门表'
verbose_name_plural = verbose_name
ordering = ['id']
部门的增加:create
查询单个部门:retrieve
查询所有的部门:list
修改部门(属性):update
局部修改部门:partial_update
删除部门:destroy
批量删除部门:multiple_delete
针对list接口而言:
查询所有的部门
请求参数有pid,代表父部门的ID
1、如果没有传pid,则查询所有的部门
2、如果传过来的pid=0,则表示查询顶级部门列表
3、如果传过来的非0,则查询某个父部门下的所有子部门列表
from rest_framework.viewsets import ModelViewSet
from erp_project.utils.base_views import MultipleDestroyMixin
from erp_system.models import DeptModel
from erp_system.serializer.dept_serializer import DeptSerializer
from rest_framework.decorators import action
from rest_framework.response import Response
from erp_project.utils.pagination import GlobalPagination
from rest_framework.permissions import IsAuthenticated
class DeptView(ModelViewSet, MultipleDestroyMixin):
"""
create:
部门--新增,
部门新增,status:201(成功),return:新增部门信息
list:
查询所有的部门
请求参数有pid,代表父部门的ID
1、如果没有传pid,则查询所有的部门
2、如果传过来的pid=0,则表示查询顶级部门列表
3、如果传过来的非0,则查询某个父部门下的所有子部门列表
update:
修改部门,部门本身的信息(属性)
destroy:
部门--删除 单个部门
部门删除,status:204,return:None
partial_update:
局部修改部门,部门本身的信息(属性)
multiple_delete:
部门--批量删除
部门删除,status:204,return:None
retrieve:
查询单个部门
返回单个部门,status:200,return:部门列表
"""
queryset = DeptModel.objects.all()
serializer_class = DeptSerializer
pagination_class = GlobalPagination
permission_classes = [IsAuthenticated]
def get_queryset(self):
"""
请求参数有pid,代表父部门的ID
1、如果没有传pid,则查询所有的部门
2、如果传过来的pid=0,则表示查询顶级部门列表
3、如果传过来的非0,则查询某个父部门下的所有子部门列表
:return:
"""
dept_id = self.request.query_params.get('dept_id', None)
if not dept_id:
queryset = DeptModel.objects.all()
return queryset
else:
dept_id = int(dept_id)
if dept_id == 0:
queryset = DeptModel.objects.filter(parent_id__isnull=True).all()
return queryset
else:
queryset = DeptModel.objects.filter(parent_id=dept_id)
return queryset
在ORM框架种,如果某一个属性为空:属性名称_ _isnull=True
只要是关联属性用:关联字段_ _其他字段,进行查询
from rest_framework import serializers
from erp_system.models import DeptModel
class DeptSerializer(serializers.ModelSerializer):
'''
用户所在部门的序列化
'''
#第一种方式
#create_time=serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S",read_only=True)
class Meta:
model=DeptModel
fields='__all__'
#第二种方式
extra_kwargs={
'create_time':{
"format":"%Y-%m-%d %H:%M:%S",
"read_only":True
}
}
from rest_framework.pagination import PageNumberPagination
class GlobalPagination(PageNumberPagination):
#项目中默认的分页配置
page_size = 10 #每页显示的数据条数
page_size_query_param = 'size' #前端发送每页数目的参数名,例如:size=20
max_page_size = 100 #前端最多设置每页显示的数量
from rest_framework.viewsets import ModelViewSet
from erp_project.utils.base_views import MultipleDestroyMixin
from erp_system.models import DeptModel
from erp_system.serializer.dept_serializer import DeptSerializer
from rest_framework.decorators import action
from rest_framework.response import Response
from erp_project.utils.pagination import GlobalPagination
class DeptView(ModelViewSet, MultipleDestroyMixin):
queryset = DeptModel.objects.all()
serializer_class = DeptSerializer
pagination_class = GlobalPagination
from django.urls import path,re_path,include
from rest_framework_jwt.views import obtain_jwt_token
from . import views
from rest_framework import routers
from erp_system.views.menu import MenuView
from erp_system.views.user import RegisterView
from erp_system.views.roles import RolesView
from erp_system.views.permissions import PermissionsView
from erp_system.views.dept import DeptView
router=routers.DefaultRouter()
router.register(r'menus',MenuView)
router.register(r'roles',RolesView)
router.register(r'permissions',PermissionsView)
router.register(r'depts',DeptView)
urlpatterns = [
re_path(r'^user/login/$',obtain_jwt_token), #以/结尾 JWT签发和认证token的视图类
re_path(r'',include(router.urls)),
re_path(r'user/register/$',RegisterView.as_view()), #用户注册路由
]