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

导读:本篇文章讲解 【Django项目开发】部门管理模块的开发(八),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在这里插入图片描述


一、模型类设计

一个部门下面可能会有很多子部门,一个子部门上面可能会有父部门;即部门内部之间进行关联,称为树形的关联结构
关联自己用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()),      #用户注册路由
]

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73914.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!