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.pswp.cn/news/452405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452405.shtml
英文地址,請注明出處:http://en.pswp.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:從服務…