Django5+Vue3 系列文章


前言

此项目采用 Django 框架的 5.0.7 版本进行开发。
Django 5.0 支持的 Python 版本为 3.10、3.11 和 3.12。
CSDN 专栏链接: ~快捷传送门: 留个赞再走呗 😭! ~

正文

初始化配置

为了确保命令行工具在应用程序中有效运行,必须先安装应用程序。

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",

    # 安装rest_framework
    'rest_framework',
    # 安装django-cors-headers
    'corsheaders',
    # 安装oaauth应用
    'apps.oaauth'
]

以下是创建命令行工具的步骤:

  1. 在应用程序的 oaauth 文件夹中,创建一个名为 management 的 Python 包。确保包含 init.py 文件,这是 Python 识别该目录为包的必要文件。
  2. 在 management 包内,进一步创建一个名为 commands 的子包。
  3. 在 commands 包中,根据您的命令功能,创建相应的 Python 脚本文件。这些文件的名称将直接映射为可执行的命令名称。

Tips:

  • 命令的执行依赖于应用程序的安装状态,即自定义命令的名称为文件名称。
  • 确保每个包都遵循 Python 的包结构规范,包含必要的__init__.py 文件。
    ---以上均为固定写法---

项目结构如下(示例):

├─apps
│  │  __init__.py
│  │
│  ├─oaauth
│  │  │
│  │  ├─management
│  │  │  │  __init__.py
│  │  │  │
│  │  │  ├─commands
│  │  │  │  │  initdepartments.py
│  │  │  │  │  inituser.py
│  │  │  │  │  __init__.py

初始化部门数据

在创建的 initdepartments.py 文件中,配置初始化部门数据

from django.core.management.base import BaseCommand
from apps.oaauth.models import OADepartment


class Command(BaseCommand):
    def handle(self,*args, **options):
        # 初始化部门数据
        boarder = OADepartment.objects.create(name='董事会', intro='董事会')
        developer = OADepartment.objects.create(name='产品开发部', intro='产品设计,技术开发')
        operator = OADepartment.objects.create(name='运营部', intro='客户运营,产品运营')
        saler = OADepartment.objects.create(name='销售部', intro='销售产品')
        hr = OADepartment.objects.create(name='人事部', intro='员工招聘,员工培训,员工考核')
        finance = OADepartment.objects.create(name='财务部', intro='财务报表,财务审核')
        self.stdout.write('部门数据初始化成功!')

完成编写后,无需手动保存。create 方法已自动将数据同步至数据库。

终端执行自定义命令将模型同步至数据库

python manage.py initdepartments

此时终端将会输出 部门数据初始化成功!

检查数据库:部门数据初始化成功

初始化用户数据

在创建的 inituser.py 文件中,配置初始化部门数据

from django.core.management.base import BaseCommand
from apps.oaauth.models import OAUser, OADepartment


class Command(BaseCommand):
    def handle(self, *args, **options):
        boarder = OADepartment.objects.get(name='董事会')
        developer = OADepartment.objects.get(name='产品开发部')
        operator = OADepartment.objects.get(name='运营部')
        saler = OADepartment.objects.get(name='销售部')
        hr = OADepartment.objects.get(name='人事部')
        finance = OADepartment.objects.get(name='财务部')
        # 董事会的员工,都是superuser用户
        # 1. 东东:属于董事会的leader
        dongdong = OAUser.objects.create_superuser(email="dongdong@qq.com",realname="东东",password="111111",department=boarder)
        # 2. 多多:董事会
        duoduo = OAUser.objects.create_superuser(email="duoduo@qq.com",realname="多多",password="111111",department=boarder)
        # 3. 张三:产品开发部的leader
        zhangsan = OAUser.objects.create_user(email="zhangsan@qq.com",realname="张三",password="111111",department=developer)
        # 4.李四:运营部的leader
        lisi = OAUser.objects.create_user(email="lisi@qq.com",realname="李四",password="111111",department=operator)
        # 5. 王五:人事部的leader
        wangwu = OAUser.objects.create_user(email="wangwu@qq.com",realname="王五",password="111111",department=hr)
        # 6. 赵六:财务部的leader
        zhaoliu = OAUser.objects.create_user(email="zhaoliu@qq.com",realname="赵六",password="111111",department=finance)
        # 7. 孙七:销售部的leader
        sunqi = OAUser.objects.create_user(email="sunqi@qq.com",realname="孙七",password="111111",department=saler)

        # 给部门指定leader和manager
        # 1. 董事会
        boarder.leader = dongdong
        boarder.manager = None

        # 2.产品开发部
        developer.leader = zhangsan
        developer.manager = dongdong

        # 3.运营部
        operator.leader = lisi
        operator.manager = dongdong

        # 4.销售部
        saler.leader = sunqi
        saler.manager = dongdong

        # 5.人事部
        hr.leader = wangwu
        hr.manager = duoduo

        # 6.财务部
        finance.leader = zhaoliu
        finance.manager = duoduo

        boarder.save()
        developer.save()
        operator.save()
        saler.save()
        hr.save()
        finance.save()

        self.stdout.write('初始用户创建成功!')

如果看不懂模型字段的设计逻辑请自行前往 部门表设计: 点个赞再走呗 😭

终端执行自定义命令将模型同步至数据库

python manage.py inituser

此时终端将会输出 初始用户创建成功!

嘿嘿! 是不是有人报错了? 😂

在之前的敲代码时,如果已经执行了相关代码,导致数据库中已经存在了部分用户数据,您可以选择清除这些数据。如果遇到删除操作失败的情况,这可能是因为 department 表与 user 表之间存在双向引用关系,导致数据无法直接删除。
在这种情况下,博主推荐采取一种更为暴力直接的方法:即删除现有的 oa 数据库,然后重新初始化一个新的 oa 数据库
不知道方法的可以跳转到专栏下的另一篇文章: ~数据库重建: 留个赞再走呗 😭! ~

重建数据库之后再依次终端输入以下指令完成模型映射:

python manage.py makemigrations

python manage.py migrate

python manage.py initdepartments

python manage.py inituser

到此,测试数据已经全部完成了! 如果觉得博主写的够详细的话就留杯奶茶再走呗!💏
您的支持就是我的动力!( ̄ ▽  ̄)↗

总结

本节详细讲解了如何创建自定义命令,以及如何通过自定义命令来初始化数据,有效地解决了项目部署后数据预设的需求。