Diango博客--14.使用 Django 项目中的 ORM 编写伪造测试数据脚本

文章目录

    • 0.思路引导
    • 1.脚本目录结构
    • 2.使用 Faker 快速生成测试数据
    • 3.批量生成测试数据
    • 4.执行脚本
    • 5.效果展示

0.思路引导

1)为了防止博客首页展示的文章过多以及提升加载速度,可以对文章列表进行分页展示。

2)不过这需要比较多的文章才能达到分页效果,但本地开发时一般都只有几篇测试文章,如果一篇篇手工添加将会非常麻烦。

3)解决方案是我们可以写一个脚本,自动生成任意数量的测试数据。脚本写好后,只需运行脚本就可以往数据库填充大量测试数据。

1.脚本目录结构

在项目根目录下新建scripts 文件夹,并新建__init__.py,fake.py,md.sample三个文件,目录结构如下:

HelloDjango-blog-tutorial\blog\blogproject\...scripts\__init__.pyfake.pymd.sample

注意:

1)其中 fake.py 是生成测试数据的脚本;

2)md.sample 是一个纯文本文件,内容是生成用于测试 Markdown 的文本。

2.使用 Faker 快速生成测试数据

博客文章包含丰富的内容元素,例如标题、正文、分类、标签。如果手工输入这些相关元素的文本会非常耗时,我们将借助一个 Python 的第三方库 Faker (造假工厂)来快速生成这些测试用的文本内容。

首先安装 Faker:

$ pipenv install Faker

Faker 通过不同的 Provider 来提供各种不同类型的假数据,我们将在下面的脚本中讲解它的部分用法,完整的用法可以参考其官方文档。

3.批量生成测试数据

文件位置:HelloDjango-blog-tutorial \scropts \fake.py

1)首先,导入一些会用到的模块,然后通过脚本所在文件找到项目根目录,将根目录添加到 Python 的模块搜索路径中,这样在运行脚本时 Python 才能够找到相应的模块并执行;

import os
import pathlib
import random
import sys
from datetime import timedeltaimport django
import faker
from django.utils import timezone# 将项目根目录添加到 Python 的模块搜索路径中
back = os.path.dirname
BASE_DIR = back(back(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

2)设置 DJANGO_SETTINGS_MODULE 环境变量,这将指定 django 启动时使用的配置文件,然后运行 django.setup() 启动 django。这是关键步骤,只有在 django 启动后,我们才能使用 django 的 ORM 系统。django 启动后,就可以导入各个模型,以便创建数据。

if __name__ == '__main__':os.environ.setdefault("DJANGO_SETTINGS_MODULE", "blogproject.settings.local")django.setup()from blog.models import Category, Post, Tagfrom comments.models import Commentfrom django.contrib.auth.models import User

3)清除旧数据,因此每次运行脚本,都会清除原有数据,然后重新生成。

print('clean database')Post.objects.all().delete()Category.objects.all().delete()Tag.objects.all().delete()Comment.objects.all().delete()User.objects.all().delete()

4)使用 django 的 ORM API 生成博客用户、分类、标签以及一篇 Markdown 测试文章。

print('create a blog user')user = User.objects.create_superuser('admin', 'admin@hellogithub.com', 'admin')category_list = ['Python学习笔记', '开源项目', '工具资源', '程序员生活感悟', 'test category']tag_list = ['django', 'Python', 'Pipenv', 'Docker', 'Nginx', 'Elasticsearch', 'Gunicorn', 'Supervisor', 'test tag']a_year_ago = timezone.now() - timedelta(days=365)print('create categories and tags')for cate in category_list:Category.objects.create(name=cate)for tag in tag_list:Tag.objects.create(name=tag)print('create a markdown sample post')Post.objects.create(title='Markdown 与代码高亮测试',body=pathlib.Path(BASE_DIR).joinpath('scripts', 'md.sample').read_text(encoding='utf-8'),category=Category.objects.create(name='Markdown测试'),author=user,)

5)生成 100 篇英文博客文章。博客文章通常内容比较长,因此我们使用了之前提及的 Faker 库来自动生成文本内容

print('create some faked posts published within the past year')fake = faker.Faker()  # Englishfor _ in range(100):tags = Tag.objects.order_by('?')tag1 = tags.first()tag2 = tags.last()cate = Category.objects.order_by('?').first()created_time = fake.date_time_between(start_date='-1y', end_date="now",tzinfo=timezone.get_current_timezone())post = Post.objects.create(title=fake.sentence().rstrip('.'),body='\n\n'.join(fake.paragraphs(10)),created_time=created_time,category=cate,author=user,)post.tags.add(tag1, tag2)post.save()

注意:

  • fake = faker.Faker(),要使用 Faker 自动生成数据,首先实例化一个 Faker 对象,然后我们可以在脚本中使用这个实例的一些方法生成需要的数据。Faker默认生成英文数据,但也支持国际化。至于如何生成中文数据在下一段脚本中会看到。

  • order_by(’?’) 将返回随机排序的结果,脚本中这块代码的作用是达到随机选择标签(Tag) 和分类(Category) 的效果。

  • 然后就是 2 个 Faker 的 API 了:
    fake.date_time_between 这个方法将返回 2个指定日期间的随机日期。三个参数分别是起始日期,终止日期和时区。我们在这里设置起始日期为 1年前(-1y),终止日期为当下(now),时区为 get_current_timezone 返回的时区,这个函数是django.utils.timezone 模块的辅助函数,它会根据 django 设置文件中 TIME_ZONE的值返回对应的时区对象。

  • ‘\n\n’.join(fake.paragraphs(10)) fake.paragraphs(10) 用于生成 10 个段落文本,以列表形式返回,列表的每个元素即为一个段落。要注意使用 2 个换行符连起来是为了符合 Markdown 语法,Markdown中只有 2 个换行符分隔的文本才会被解析为段落。

6)构造 Faker 实例,传入了一个语言代码 zh_CN,这将生成中文的虚拟数据,而不是默认的英文。

fake = faker.Faker('zh_CN')for _ in range(100):  # Chinesetags = Tag.objects.order_by('?')tag1 = tags.first()tag2 = tags.last()cate = Category.objects.order_by('?').first()created_time = fake.date_time_between(start_date='-1y', end_date="now",tzinfo=timezone.get_current_timezone())post = Post.objects.create(title=fake.sentence().rstrip('.'),body='\n\n'.join(fake.paragraphs(10)),created_time=created_time,category=cate,author=user,)post.tags.add(tag1, tag2)post.save()

7)给前 20 篇文章(Post) 生成评论数据。要注意的是评论的发布时间必须位于被评论文章的发布时间和当前时间之间,这就是 delta_in_days = ‘-’ + str((timezone.now() - post_created_time).days) + ‘d’ 这句代码的作用。

print('create some comments')for post in Post.objects.all()[:20]:post_created_time = post.created_timedelta_in_days = '-' + str((timezone.now() - post_created_time).days) + 'd'for _ in range(random.randrange(3, 15)):Comment.objects.create(name=fake.name(),email=fake.email(),url=fake.uri(),text=fake.paragraph(),created_time=fake.date_time_between(start_date=delta_in_days, end_date="now", tzinfo=timezone.get_current_timezone()),post=post,)print('done!')

4.执行脚本

在项目根目录执行下面的命令运行整个脚本:

$ pipenv run python -m scripts.fake

看到如下的输出说明脚本执行成功了。

clean database
create a blog user
create categories and tags
create a markdown sample post
create some faked posts published within the past year
create some comments
done!

5.效果展示

此时,我们有了 200 多篇测试文章,用来测试分页效果就十分简单了,接下来我们将实现功能完整的分页效果。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Sql Server 2008的分布式数据库的实践

配置Sql Server 2008(Win7) 1.打开SQL server2012,使用windows身份登录 2.登录后,右键选择“属性”。左侧选择“安全性”,选中右侧的“SQL Server 和 Windows 身份验证模式”以启用混合登录模式 3.选择“连接”&#x…

横向技术分析C#、C++和Java优劣

本文将从技术人员的角度横向分析C#、C和Java优劣,其实选择Java阵营还是.NET阵营,大家可以根据自己的实际需要来确定。 C#诞生之日起,关于C#与Java之间的论战便此起彼伏,至今不辍。抛却Microsoft与Sun之间的恩怨与口角,…

软件测试中的存根程序

存根程序用来代替被测试的模块所调用的模块,因此存根程序也称为“虚拟子程序”,它利用被它代替的模块的接口,只做尽可能少的数据操作。

计算机网络应用云计算,计算机网络云计算的类型

原标题:计算机网络云计算的类型随着现代计算机网络技术的不断发展,越来越多的与计算机网络有关的现代化技术得以出现,并且有着广泛的应用,其中云计算技术就是比较常见的一种,在实际应用中发挥着较高的价值。在信息时代…

sublime_text快捷键

1、注释:选中文本后,CTRL / 2、CTRL N,CTRLS,保存成.html文件后,只需要输入感叹号!,然后tab键,即可打印出基本的html格式!转载于:https://www.cnblogs.com/JAVA-STUDYER/p/855040…

Diango博客--15.通过 Django Pagination 实现简单分页(一)

文章目录0.思路引导1.Paginator 类的常用方法2.用 Paginator 给文章列表分页3.在模板中设置分页导航4.效果展示0.思路引导 1)当博客上发布的文章越来越多时,通常需要进行分页显示,以免所有的文章都堆积在一个页面,影响用户体验。…

SpringMVC 测试 mockMVC

SpringMVC测试框架 基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程,即从URL请求到控制器处理,再到视图渲染都可以测试。 一 MockMvcBuilder MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现&…

自顶向下和自底向上测试的优缺点

自顶向下测试方法的主要优点是不需要测试驱动程序,能够在测试阶段的早期实现并验证系统的主要功能,而且能在早期发现上层模块的接口错误。 自顶向下测试方法的主要缺点是需要存根程序,可能遇到与此相联系的测试困难,低层关键模块中…

C++ class中的静态(static)成员

C class中的静态(static)成员 (1) 静态数据成员 ①一般地静态数据成员在该类定义之外被初始化,如同一个成员函数被定义在类定义之外一样。在这种定义中的静态成员的名字必须被其类名限定修饰,例如下面是_interestRate的初始…

用计算机弹可惜不是你,可惜不是你 还是幸亏不是你

一、 你没有再挽留 我也没有再回头 就这样 无风无雨也无晴 无疾而终二、 是我孤陋寡闻不知你心有人三、 如果作业有葬礼,全体学生定当盛装出席.四、 纵使我有千般好 你也看不到 因为你没有一双爱我的眼睛五、 原来暂时共你没缘分 来年先会变得更合衬六、 真的别回头 你有未来 你…

PHP 完整实战23种设计模式

PHP实战创建型模式 单例模式 工厂模式 抽象工厂模式 原型模式 建造者模式 PHP实战结构型模式 桥接模式 享元模式 外观模式 适配器模式 装饰器模式 组合模式 代理模式 过滤器模式 PHP实战行为型模式 模板模式 策略模式 状态模式 观察者模式 责任链模式 访问者模…

Diango博客--16.稳定易用的 Django 分页库,完善分页功能(二)

文章目录0.思路引导1.分页效果概述2.分页思路3.Django 第三方拓展:django-pure-pagination4.自定义模板0.思路引导 1)在前面我们通过 Django Pagination 实现简单分页 中,我们实现了一个简单的分页导航。但效果有点差强人意,我们…

回归测试

在集成测试过程中,每当一个新模块结合进来时,程序就发生了变化:建立了新的数据流路径,可能出现了新的I/O操作,激活了新的控制逻辑。在集成测试的范畴中,回归测试是指重新执行已经做过的测试的某个子集&…

不同的写法 其中 1 2 (试了下 没有效果 ,先记载这里把)

转载于:https://www.cnblogs.com/kaibindirver/p/9145455.html

美国西北大学 计算机工程专业排名,[转载]美国西北大学计算机工程研究生最新专业排名...

对于打算去美国西北大学读研究生的学生来讲,美国西北大学研究生申请要求及美国西北大学研究生专业介绍是学生最关心的问题。本文香港介绍美国西北大学研究生申请要求及美国西北大学研究生的专业介绍,帮助更多的学生更好的了解美国西北大学。2016年西北大…

析构函数virtual与非virtual区别

作为通常的原则,如果一个类定义了虚函数,那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着:这个类会被继承,并且会通过基类的指针指向子类对象,从而得到多态性。 这个类可能会被继承,并且会…

Python:字典列表字符串方法测试

测试的一些Python中的关于字典、列表、字符串的使用方法,放在这里备查。整个测试代码和说明如下: # -*- coding: utf-8 -*- """Python:函数中全是指针传递,而任何变量都是给予一个指针指向一个内存空间"""impo…

什么是确认测试

确认测试也称为验收测试,它的目标是验证软件的有效性。 通常,验证指的是保证软件正确地实现了某个特定要求的一系列活动;确认指的是为了保证软件确实满足了用户需求而进行的一系列活动。 软件有效性的一个简单定义是:如果软件的功…

Diango博客--17.统计各个分类和标签下的文章数

文章目录0.思路引导1.Model 回顾2.数据库数据聚合3.使用 Annotate4.在模板中引用新增的属性0.思路引导 在我们的博客侧边栏有分类列表和标签列表,显示博客已有的全部文章分类。现在想在分类名和标签名后显示该分类或者标签下有多少篇文章,该怎么做呢&am…

HTTP协议中request报文请求方法和状态响应码

一个HTTP请求报文由4部分组成: 请求行(request line)请求头部(header)空行请求数据下图给出了请求报文的一般格式: 请求行中包括了请求方法,常见的请求方法有: GET:从服务…