【Django项目开发】部门管理模块的开发(九)

【Django项目开发】部门管理模块的开发(九)_第1张图片


文章目录

  • 一、模型类设计
  • 二、视图设计
    • 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()),      #用户注册路由
]

【Django项目开发】部门管理模块的开发(九)_第2张图片

你可能感兴趣的:(django,django,python,后端)