当前位置: 首页 > news >正文

django项目添加测试数据的三种方式

文章目录

        • 自定义终端命令
        • Faker添加模拟数据
        • 基于终端脚本来完成数据的添加
          • 编写python脚本
          • 编写shell脚本
          • 执行脚本需要权限
          • 使用shell命令来完成测试数据的添加

添加测试数据在工作中一共有三种方式:

  1. 可以根据django的manage.py指令进行[自定义终端命令]
  2. 可以采用第三方模块Faker来完成数据的模拟添加(Faker模块可以写在上面第一种方法里面)
  3. 可以使用python脚本或者shell脚本来完成

如果数据量不是很大,可以通过sql语句以及在数据库添加。

自定义终端命令

文档:https://docs.djangoproject.com/zh-hans/3.2/howto/custom-management-commands/

在子应用目录下添加一个 management/commands 包目录,然后这个commands里面处理__init__.py以外其他文件的文件名将作为django-admin或者python manage.py的命令选项了。注意:文件名不能以_开头,否则不会被识别为命令。

接着我们可以在commands包下根据自己的业务需要,编写对应的命令。例如,我们现在需要在courses子应用下添加课程对应的测试数据,所以我们在courses下创建 management/commands 包目录,然后创建命令文件example.py,代码:

import constants
from django.core.management.base import BaseCommand, CommandError
from courses.models import Teacher# 类名必须是Command而且一个文件就是一个命令类,这个命令类必须直接或间接继承BaseCommand
class Command(BaseCommand):help = '添加课程相关的测试数据'# 如果当前命令,需要接受来自终端的参数,可以使用add_argumentsdef add_arguments(self, parser):pass# 位置参数,必填项# parser.add_argument('name', nargs='+', type=int)# 命令参数,可选项# parser.add_argument(#     '--table',#     action='store_true',#     help='Delete poll instead of closing it',# )# 命令执行的核心方法,def handle(self, *args, **options):"""添加测试数据"""print("添加测试数据")Teacher.objects.create(name="赵小明",avatar="teacher/avatar.jpg",role=1,title="老师",signature="从业3年,管理班级无数",brief="从业3年,管理班级无数",)

此时,执行python manage.py可以看到course应用下已经有了相关的终端命令

在这里插入图片描述

Faker添加模拟数据

文档:https://faker.readthedocs.io/en/stable/locales/zh_CN.html#

github:https://github.com/joke2k/faker/

faker是一个在多个编程语言里面都比较常用的第三方工具类,它的作用就是可以提供非常有效的方式帮开发者生成一些模拟仿真的测试数据。

pip install faker

可以结合上面的自定义终端命令来实现,example.py,代码:

import constants,random
from django.core.management.base import BaseCommand, CommandError
from courses.models import Teacher
from faker import Faker
from django.conf import settings# 类名必须是Command而且一个文件就是一个命令类,这个命令类必须直接或间接继承BaseCommand
class Command(BaseCommand):help = '添加课程相关的测试数据'# 如果当前命令,需要接受来自终端的参数,可以使用add_argumentsdef add_arguments(self, parser):# 位置参数,必填项# parser.add_argument('date_type', nargs='+', type=int, help="添加数据的类型")# 命令参数,可选项parser.add_argument('--type',dest='type',default='teacher',type=str,help='测试数据的类型',)parser.add_argument('--number',dest='number',default=10,type=int,help='添加数据的数量',)# 命令执行的核心方法,def handle(self, *args, **options):"""添加课程相关的测试数据"""if options["type"] == "teacher":self.add_teacher(options)elif options["type"] == "direction":self.add_direction(options)def add_teacher(self,options):"""添加授课老师的测试数据"""faker = Faker(["zh_CN"])for i in range(options["number"]):Teacher.objects.create(name=faker.unique.name(), # 唯一的姓名avatar="teacher/avatar.jpg",role=random.randint(0,2),title="老师",signature= "从业3年,管理班级无数",brief= f"从业3年,管理班级无数,联系电话:{faker.unique.phone_number()},邮箱地址:{faker.unique.company_email()}",)print("添加授课老师的测试数据完成....")def add_direction(self,options):"""添加学习方向的测试数据"""print("添加学习方向的测试数据完成....")

终端下调用:

cd ~/Desktop/luffycity/luffycityapi
python manage.py example
python manage.py example --type=teacher
python manage.py example --type=direction
python manage.py example --type=teacher  --number=10
基于终端脚本来完成数据的添加

要编写一个python或者shell脚本,就要清楚一件事情,就是我们可以根据对应的语言来编写对应的终端代码,但是必须在首行的位置声明执行这些代码的解析器是谁?路径在哪里?

可以通过whereis python或者whereis bash得到python解释器或者bash的路径

在这里插入图片描述

当脚本中需要用到某些库时,就要确保首行路径环境中已经下载

编写python脚本

首行指定运行当前代码的python解释器。写完整绝对路径

test1.py,代码:

#! /home/jack/anaconda3/envs/luffycity/bin/python# 首行以后的代码必须要符合python的语法
"""
针对通用代码的运行,可以直接使用系统内置的全局环境的python解释器,也可以使用虚拟环境的解析器
#! /usr/bin/python3
如果这个代码需要调用对应的第三方模块,那么就要写上安装该模块的python解释器
#! /home/moluo/anaconda3/envs/luffycity/bin/python
"""
import os, sys
from faker import Fakerfaker = Faker(["zh_CN"])
user = faker.unique.name()
print(f"hello,{user}")# python获取终端参数
try:dir = sys.argv[1]  # 0 ==> ./test1.py    1 ==> user
except Exception as e:dir = "2021"# python直接执行shell命令
# ret = os.popen("ls -l")
ret = os.popen("ls -l")  # 等同于上一行
print(ret.read())ret = os.popen(f"mkdir {dir} && cd {dir} && echo 'hello {user}' > index.html")  # 等同于上一行
print(ret.read())
编写shell脚本

首行指定运行当前代码的shell解释器。写完整路径。

test2.sh,代码:

#!/bin/bashls -larecho 'hello'git add .
git commit -m "hello"
git push# 通过这种方式执行命令行语句可以保存记录,一目了然执行过哪些命令
执行脚本需要权限

不管编写的什么的脚本命令,编写完脚本以后,脚本本身因为操作系统默认会取消它的执行权限,所以我们通过以下命令来增加执行的权限。

chmod +x 对应的文件名
# chmod 755 对应的文件名# 例如,给python脚本赋予执行的权限。文件名假设为:test1.py
chmod +x test1.py# 例如,shell脚本赋予执行的权限,文件名假设为:test2.sh
chmod +x test2.sh

赋予了权限以后,就可以执行脚本了。

但是执行过程中, 一定使用相对路径的方式来执行这个脚本。

# 例如,上面的test1.py或者test2.sh
./test1.py
./test2.sh# 如果不希望使用相对路径,则需要把当前文件所载的目录设置为环境变量才行。
使用shell命令来完成测试数据的添加
  1. 编写一个sql语句的文件test_data.sql

    -- 如果使用数据库本身的外键,则添加/删除/修改数据时,务必关闭原来表中的主外键约束功能
    set FOREIGN_KEY_CHECKS=0;-- 清空原有的课程信息表信息
    truncate table fg_course_info;-- 添加课程信息
    INSERT INTO luffycity.fg_course_info (id, name, orders, is_show, is_deleted, created_time, updated_time, course_cover, course_video, course_type, level, description, pub_date, period, attachment_path, attachment_link, status, students, lessons, pub_lessons, price, recomment_home_hot, recomment_home_top, category_id, direction_id, teacher_id)
    VALUES
    (1, '7天Typescript从入门到放弃', 1, 1, 0, '2021-07-22 04:35:05.696823', '2021-07-22 04:35:05.696871', 'course/cover/course-10.png', '', 0, 0, '<p>7天Typescript从入门到放弃</p>', '2021-07-22', 7, 'luffycity-celery用法1.zip', null, 0, 988, 100, 30, 998.00, 1, 1, 2, 1, 1),
    (2, '3天Typescript精修', 1, 1, 0, '2021-07-22 04:35:05.696823', '2021-07-22 04:35:05.696871', 'course/cover/course-9.png', '', 0, 0, '<p>3天Typescript精修</p>', '2021-07-22', 7, 'luffycity-celery用法1.zip', null, 0, 988, 100, 30, 998.00, 1, 1, 2, 1, 1),
    (3, '3天学会Vue基础', 1, 1, 0, '2021-07-22 04:35:05.696823', '2021-07-22 04:35:05.696871', 'course/cover/course-8.png', '', 0, 0, '<p>3天学会Vue基础</p>', '2021-07-22', 7, 'luffycity-celery用法1.zip', null, 0, 988, 100, 30, 998.00, 1, 1, 2, 1, 1);-- 如果使用数据库本身的外键,则添加/删除/修改数据以后,务必开启原来表中的主外键约束功能
    set FOREIGN_KEY_CHECKS=1;
    
  2. 编写一个shell脚本test_data.sh来执行上面的文件

    #! /bin/bash
    mysql -uroot -p123 luffycity < ./test_data.sql
    
  3. 赋予create_data.sh执行的权限

    chmod +x test_data.sh
    ./test_data.sh
    

若有错误与不足请指出,关注DPT一起进步吧!!

相关文章:

  • 开发者“SmilingWolf”的标签标注模型
  • K8S精进之路-控制器StatefulSet有状态控制 -(2)
  • 基于springboot vue 大学生竞赛管理系统设计与实现
  • 速盾:高防cdn防御的时候会封ip吗?
  • 【线程】线程安全的单例模式
  • C\C++内存管理详解
  • 基于Jeecg-boot开发系统--后端篇
  • Linux-df命令使用方法
  • Vue3 路由传参:玩转 params,让页面交互更流畅!
  • 设计模式-PIMPL 模式
  • RNN模型学习
  • C++ 排序算法
  • 自适应查询优化(Adaptive Query Optimization, AQO)技术简介
  • react crash course 2024(5) useState钩子
  • DPDK 简易应用开发之路 2:UDP数据包发送及实现
  • __proto__ 和 prototype的关系
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 2017 前端面试准备 - 收藏集 - 掘金
  • echarts花样作死的坑
  • Git初体验
  • js数组之filter
  • Redux系列x:源码分析
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 百度地图API标注+时间轴组件
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 浅谈Golang中select的用法
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 问题之ssh中Host key verification failed的解决
  • 最近的计划
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #职场发展#其他
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (5)STL算法之复制
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (八)Flask之app.route装饰器函数的参数
  • (笔记)M1使用hombrew安装qemu
  • (二) 初入MySQL 【数据库管理】
  • (二)hibernate配置管理
  • (二十三)Flask之高频面试点
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (全注解开发)学习Spring-MVC的第三天
  • (四)模仿学习-完成后台管理页面查询
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)为C# Windows服务添加安装程序
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .mysql secret在哪_MySQL如何使用索引