django项目添加测试数据的三种方式
文章目录
- 自定义终端命令
- Faker添加模拟数据
- 基于终端脚本来完成数据的添加
- 编写python脚本
- 编写shell脚本
- 执行脚本需要权限
- 使用shell命令来完成测试数据的添加
添加测试数据在工作中一共有三种方式:
- 可以根据django的manage.py指令进行[自定义终端命令]
- 可以采用第三方模块Faker来完成数据的模拟添加(Faker模块可以写在上面第一种方法里面)
- 可以使用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命令来完成测试数据的添加
-
编写一个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;
-
编写一个shell脚本test_data.sh来执行上面的文件
#! /bin/bash mysql -uroot -p123 luffycity < ./test_data.sql
-
赋予create_data.sh执行的权限
chmod +x test_data.sh ./test_data.sh
若有错误与不足请指出,关注DPT一起进步吧!!
相关文章:

django项目添加测试数据的三种方式
文章目录 自定义终端命令Faker添加模拟数据基于终端脚本来完成数据的添加编写python脚本编写shell脚本执行脚本需要权限使用shell命令来完成测试数据的添加 添加测试数据在工作中一共有三种方式: 可以根据django的manage.py指令进行[自定义终端命令]可以采用第三方…...

用Python提取PDF表格到Excel文件
在对PDF中的表格进行再利用时,除了直接将PDF文档转换为Excel文件,我们还可以提取PDF文档中的表格数据并写入Excel工作表。这样做可以避免一些不必要的文本和格式带来的干扰,获得更易于分析和处理的表格数据,并方便进行更多的格式设…...
Java基础|多线程:多线程分页拉取
前言: 通常我们都会遇到分页拉取的需求,比如与第三方系统同步数据,定时拉取全量数据做缓存,下面我们简单介绍下多线程分页写法 需求: 全量同步第三方系统数据,并在全部数据同步完后,统一做缓存…...

Android RecyclerView 实现 GridView ,并实现点击效果及方向位置的显示
效果图 一、引入 implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30 二、使用步骤 1.Adapter public class UnAdapter extends BaseQuickAdapter<UnBean.ResultBean, BaseViewHolder> {private int selectedPosition RecyclerView.NO_POSITIO…...
Centos中dnf和yum区别对比
dnf和yum是两种不同的包管理工具,它们各自具有独特的特点和优势,主要用于在Linux系统上安装、更新和卸载软件包。以下是dnf和yum之间的主要区别: 1. 依赖关系解决 dnf:dnf在处理依赖关系方面表现出更强的能力。它能够更高效地解…...

CVPT: Cross-Attention help Visual Prompt Tuning adapt visual task
论文汇总 当前的问题 图1:在VTAB-1k基准测试上,使用预训练的ViT-B/16模型,VPT和我们的CVPT之间的性能和Flops比较。我们将提示的数量分别设置为1、10、20、50,100,150,200。 如图1所示,当给出大量提示时,VPT显示了性能的显著下降…...
基于双向 LSTM 和 CRF 的序列标注模型
基于双向 LSTM 和 CRF 的序列标注模型 在自然语言处理中,序列标注是一项重要的任务,例如命名实体识别、词性标注等。本文将介绍如何使用 Keras 构建一个基于双向 LSTM 和 CRF 的序列标注模型。 一、引言 序列标注任务要求为输入序列中的每个元素分配一个标签。传统的方法可…...

为何美国与加拿大边界看似那么随意?
我们在《日本移民巴西超200万,会成第二个“巴勒斯坦”吗?》一文中探讨了日本移民巴西的历史,以及移民对巴西的风险与挑战。 今天我们来探讨美国与加拿大边界为什么那么随意,并整理了加拿大和美国的国界、省界、市界行政边界数据分享给大家&a…...
什么是触发器(Trigger)?触发器何时会被触发?
在数据库管理系统中,触发器是一种特殊的存储过程,它会在特定的表上执行插入、更新或删除操作时自动触发。 触发器的主要用途是维护数据的一致性和完整性,以及实现一些复杂的业务逻辑。 触发器何时会被触发? 触发器可以在以下几…...
一步一步优化一套生成式语言模型系统
以下是这套生成式语言模型解决任务的流程图概述: #mermaid-svg-keXg8yGoCyObKDtu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-keXg8yGoCyObKDtu .error-icon{fill:#552222;}#mermaid-svg-keXg8yGoCyO…...

Q必达任务脚本
文章目录 1.购买服务器地址2.部署教程3. 代码如下4. 如何联系我 1.购买服务器地址 服务器购买地址 https://t.aliyun.com/U/rUHk58 若失效,可用地址 https://www.aliyun.com/activity/wuying/dj?source5176.29345612&userCode49hts92d 2.部署教程 2024年最…...

问请问请问2312123213123
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...

Vue3:快速生成模板代码
目录 一.模板代码 1.提供基础结构 2.定义组件名称 3.初始化数据和方法 4.应用样式 5.提高开发效率 二.操作 1.点击右下角设置按钮选择代码片段 2.输入vue.json,打开vue.json文件 3.构造模板 4.模板代码 5.使用 6.效果 一.模板代码 Vue3快速生成模板代…...

文件上传-php
查找方式 ***(1) 黑盒 查找(upload) 扫描 (2) 应用型 窗口 上传中心或者后台中心 上传 Ps:后台是后台 权限是权限 (3) 会员中心 (4) 白盒 基本函数定义 写前端的 Enctype 上传类型Method 提交方式Onsubmit 鼠标的时间Action"放在指定文件"Php 接受表单数据 isset(…...

C++设计模式(更新中)
文章目录 1、创建型模式1.1 简单工厂(Simple Factory)(1)示例(2)总结 1.2 工厂方法(Factory Method)(1)示例(2)总结 1.3 抽象工厂&…...

Kali crunsh字典工具
查看自带密码字典 vim /usr/share/wordlists 使用 crunch 字典工具 随机组成6位纯数字密码 crunch 6 6 0123456789 -o test1.txt 由 Abc1234 随机组成的 6~8 位密码 crunch 6 8 Abc1234 -o test2.txt 以A开头后面跟3位数字组成的4位密码 crunch 4 4 -t A%%% -o test3.txt...
Redis系列---Redission分布式锁
文章目录 类型原理使用看门狗与setNx比较 类型 使用Redission,lock的机制其实是使用了ttl,一直等ttl为0再get。无论是redission还是redis的setNx,只要是锁,都必须有加锁和释放锁两个动作,二者缺一不可,并且…...
算法打卡:第十一章 图论part05
今日收获:并查集理论基础,寻找存在的路径 1. 并查集理论基础(from代码随想录) (1)应用场景:判断两个元素是否在同一个集合中 (2)原理讲解:通过一个一维数组…...

3.《DevOps》系列K8S部署CICD流水线之部署MetalLB负载均衡器和Helm部署Ingress-Nginx
架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G操作系统:Rocky9.3 后续通过K8S部署GitLab、Harbor、Jenkins 为什么使用MetalLB 当使用云平…...

MySQL:表的约束
目录 1 空属性 2 默认值 3 列描述 4 zerofill 5 主键 6 自增长 7 唯一键 8 外键 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...