把测试数据输入数据库是件麻烦事。很多开发者选择随机按键,输入虚假的测试数据,例如
wTFzmN00bz7 。与其这样,不如编写一个脚本,把真实可信的数据自动填充到数据库中。如此一
来,演示或测试应用时,你将看到合理的示例。而且,部署应用或者与同事分享时,你自己和同
事无需自己动手输入示例数据。鉴于此,最好编写一个填充脚本。
下面为 Rango 应用编写一个填充脚本。在 Django 项目的根目录中新建一个 Python 文件,命名为
populate_rango.py,写入下述代码:
1 import os
2 os.environ.setdefault('DJANGO_SETTINGS_MODULE',
3 'tango_with_django_project.settings')
4
5 import django
6 django.setup()
7 from rango.models import Category, Page
8
9 def populate():
10 # 首先创建一些字典,列出想添加到各分类的网页
11 # 然后创建一个嵌套字典,设置各分类
12 # 这么做看起来不易理解,但是便于迭代,方便为模型添加数据
class Category(models.Model):
name = models.CharField(max_length=128, unique=True)
class Meta:
verbose_name_plural = 'Categories'
def __str__(self):
return self.name
13
14 python_pages = [
15 {"title": "Official Python Tutorial",
16 "url":"http://docs.python.org/2/tutorial/"},
17 {"title":"How to Think like a Computer Scientist",
18 "url":"http://www.greenteapress.com/thinkpython/"},
19 {"title":"Learn Python in 10 Minutes",
20 "url":"http://www.korokithakis.net/tutorials/python/"} ]
21
22 django_pages = [
23 {"title":"Official Django Tutorial",
24 "url":"https://docs.djangoproject.com/en/1.9/intro/tutorial01/"},
25 {"title":"Django Rocks",
26 "url":"http://www.djangorocks.com/"},
27 {"title":"How to Tango with Django",
28 "url":"http://www.tangowithdjango.com/"} ]
29
30 other_pages = [
31 {"title":"Bottle",
32 "url":"http://bottlepy.org/docs/dev/"},
33 {"title":"Flask",
34 "url":"http://flask.pocoo.org"} ]
35
36 cats = {"Python": {"pages": python_pages},
37 "Django": {"pages": django_pages},
38 "Other Frameworks": {"pages": other_pages} }
39
40 # 如果想添加更多分类或网页,添加到前面的字典中即可
41
42 # 下述代码迭代 cats 字典,添加各分类,并把相关的网页添加到分类中
43 # 如果使用的是 Python 2.x,要使用 cats.iteritems() 迭代
44 # 迭代字典的正确方式参见
45 # http://docs.quantifiedcode.com/python-anti-patterns/readability/
46
47 for cat, cat_data in cats.items():
48 c = add_cat(cat)
49 for p in cat_data["pages"]:
50 add_page(c, p["title"], p["url"])
# 打印添加的分类
53 for c in Category.objects.all():
54 for p in Page.objects.filter(category=c):
55 print("- {0} - {1}".format(str(c), str(p)))
56
57 def add_page(cat, title, url, views=0):
58 p = Page.objects.get_or_create(category=cat, title=title)[0]
59 p.url=url
60 p.views=views
61 p.save()
62 return p
63
64 def add_cat(name):
65 c = Category.objects.get_or_create(name=name)[0]
66 c.save()
67 return c
68
69 # 从这开始执行
70 if __name__ == '__main__':
71 print("Starting Rango population script...")
72 populate()
◆ 导入模型 ◆
导入 Django 模型之前要导入 django ,并把环境变量 DJANGO_SETTINGS_MODULE 设为项目的设
置文件,然后调用 django.setup() ,导入 Django 项目的设置(第 1-6 行)。
如果缺少这重要的一步,导入模型时会抛出异常,这是因为所需的 Django 基础设施未初始
化。鉴于此,我们在第 7 行才导入 Category 和 Page 模型。
保存文件,在终端把当前工作目录切换到 Django 项目的根目录,然后执行 python
populate_rango.py 命令。你应该会看到类似下面的输出,在不同的电脑中添加分类的顺序可能有
所不同。
$ python populate_rango.py
Starting Rango population script...
- Python - Official Python Tutorial
- Python - How to Think like a Computer Scientist
- Python - Learn Python in 10 Minutes
- Django - Official Django Tutorial
- Django - Django Rocks
- Django - How to Tango with Django
- Other Frameworks - Bottle
- Other Frameworks - Flask
然后,确认填充脚本确实把数据填充进数据库中了。重启 Django 开发服务器,访问管理界面
(http://127.0.0.1:8000/admin/),检查有没有新的分类和网页出现。点击“Pages”,有没有看到所
有网页,如下图所示?
编写填充脚本要花点时间,但从长远来看,最终是能节省时间的。把应用部署到其他地方,只需
运行填充脚本就能立即演示,这样多方便。单元测试也能用到填充脚本

本文介绍如何通过编写Python脚本自动填充数据库,以简化测试数据的输入过程。通过具体实例展示了如何为Django应用的Category和Page模型填充真实数据,从而提高测试效率。
1923

被折叠的 条评论
为什么被折叠?



