
文章目录
- 一、模型类设计
 - 二、视图设计
 - 1.都有哪些接口
 
- 三、序列化器类设计
 - 四.分页操作
 - 1.utils工具中定义pagination.py
 - 2.视图类中使用
 
- 五.路由配置
 
一、模型类设计
一个部门下面可能会有很多子部门,一个子部门上面可能会有父部门;即部门内部之间进行关联,称为树形的关联结构
 关联自己用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']
 
二、视图设计
1.都有哪些接口
部门的增加: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
            }
        }
 
四.分页操作
1.utils工具中定义pagination.py
from rest_framework.pagination import PageNumberPagination
class GlobalPagination(PageNumberPagination):
    #项目中默认的分页配置
    page_size = 10  #每页显示的数据条数
    page_size_query_param = 'size'  #前端发送每页数目的参数名,例如:size=20
    max_page_size = 100         #前端最多设置每页显示的数量
 
2.视图类中使用
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()),      #用户注册路由
]
 



















