为一个模型生成大量mock数据,方便开发测试性能。
我们的模型字段定义如下:
class Document(models.Model):
# 档案
date = models.DateField("收文日期")
number = models.CharField("发文字号", max_length=128)
kind = models.CharField("公文种类", max_length=32)
title = models.CharField("标题", max_length=256)
pages = models.PositiveSmallIntegerField("页数", default=1)
department = models.ForeignKey(
to="user.Department",
verbose_name="发往单位",
null=True,
blank=True,
on_delete=models.SET_NULL
)
如何快速生成大量的测试数据呢?方法有很多,这里提供我常用的方式如下。 这里涉及的知识点有
-
python多线程
-
request库获取一段随机中文API的数据
"https://api.ixiaowai.cn/api/ylapi.php"
-
独立Django环境的运行方式
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
和
django.setup()
。
-
随机数据的方法。
import os
import random
import threading
import time
from datetime import datetime
import django
import requests
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
django.setup()
from user.models import Department
from public_api.models import Document
COUNT = 1000
URL = "https://api.ixiaowai.cn/api/ylapi.php"
DEPARTMENT_SET = Department.objects.filter(depth=2).values_list("id", flat=True)
def get_random_department_id():
return DEPARTMENT_SET[random.randint(0, DEPARTMENT_SET.count() - 1)]
def get_random_document():
Document.objects.create(
date=f"20{str(random.random())[2:4]}-{random.randint(1, 12)}-{random.randint(1, 28)}",
number="字" + str(random.random())[2:],
kind="种类" + str(random.random())[3],
title=requests.get(URL).text[:20],
pages=random.randint(1, 100),
department_id=get_random_department_id()
)
def gen_document(count):
for i in range(count):
get_random_document()
time.sleep(1)
if __name__ == "__main__":
t1 = threading.Thread(target=gen_document, args=(1000,))
t2 = threading.Thread(target=gen_document, args=(1000,))
t3 = threading.Thread(target=gen_document, args=(1000,))
t4 = threading.Thread(target=gen_document, args=(1000,))
t1.start()
t2.start()
t3.start()
t4.start()
t1.join()
t2.join()
t3.join()
t4.join()