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…

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

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

SpringMVC 测试 mockMVC

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

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

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

不同的写法 其中 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:从服务…

bmon:一个强大的网络带宽监视和调试工具

bmon 是类 Unix 系统中一个基于文本,简单但非常强大的 网络监视和调试工具,它能抓取网络相关统计信息并把它们以用户友好的格式展现出来。它是一个可靠高效的带宽监视和网速估测工具。 它能使用各种输入模块读取输入,并以各种输出模式显示输出…

计算机d盘无法格式化,四种方法解决D盘无法格式化问题

不少朋友系统出现故障,几乎都是选择重装系统的方法来解决问题。系统重装后,不少朋友觉得D盘没有什么重要的东西,就想将其格式化,可是系统出现windows无法格式该驱动器的提示,这是怎么回事呢?D盘无法格式化要…

sqlserver视图

作用 ①简化了操作,把经常使用的数据定义为视图。 ②安全性,用户只能查询和修改能看到的数据。 ③逻辑上的独立性,屏蔽了真实表的结构带来的影响。 对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据&#…

Diango博客--18.使用 Fabric 自动化部署 Django 项目

文章目录1.本地安装 Fabric2.部署过程回顾3.完善项目配置4.修改 BASE_DIR 配置项5.设置 Supervisor 环境变量6.编写 Fabric 脚本7.执行 Fabric 自动部署脚本1.本地安装 Fabric $ pipenv install fabric --dev 报错: An error occurred while installing django-pure…

自断前程,未来80%IT工作将实现自动化

技术人员革了自己的命? 在上周的Structure大会上,硅谷著名风险投资人、亿万富翁唯诺德称未来80%的IT工作都将被AI系统所替代。不过,唯诺德好像并不担心,相反他补充了一句“我觉得很兴奋。”唯诺德表示自己并非危言耸听&#xff0c…

转://Linux Multipath多路径配置与使用案例

在Linux平台一部分存储产品使用操作系统自带的多路径软件,包括最常见的HP和IBM的部分存储产品,在Linux自带的多路径软件叫做multipath,这篇文章以HP EVA系列存储在Linux平台的使用为例,详细的在Linux平台配置和使用多路径。 那么问…

Windows中安装MongoDB以及studio3t

文章目录1.安装MongoDB2.配置并启动MongoDB3.使用studio3t连接mongodb1.安装MongoDB 运行 mongodb-win32-x86_64-2008plus-ssl-v3.4-latest-signed.msi 2.配置并启动MongoDB 创建几个文件夹具体如下: 1)数据库路径(data目录) 2…

为旗下硬件产品服务,LG推出基于SLAM技术的3D摄像头

LG官方则表示,集成了LG的3D摄像头和SLAM技术的单个模块性价比很高。 今年3月份的时候,LG在MWC 2017上展示其和Valve合作的VR头显,最近他们宣布将基于AR公司Augmented Pixels的技术开发一个3D摄像头模块,来辅助他们的各种硬件产品…

VS工程切换cuda版本

在工程面板,切换到类视图,选中项目,右键菜单选择【生成自定义(B)…】,弹出下面窗口 在窗口勾选上CUDA版本,即可切换 转载于:https://www.cnblogs.com/xingzhensun/p/9154094.html

揭秘Microsoft Bing与Google搜索背后的故事

导读:Google搜索引擎已经赢得全球范围的赞誉,而这一切都要归功于Google开创性的MapReduce。Google搜索引擎算法只是其搜索引擎的一部分,在后台支持Google算法的基础设施才是真正的幕后英雄,其基础设施可快速的索引链接成千上万台普…