Django - 为测试目的填充数据库
我需要在我的数据库里填充一些虚拟数据(大约200条以上),这样我才能测试我做的管理界面。我在想有没有更好的方法来做到这一点。昨天我花了大部分时间试着手动填充数据(也就是像这样用 my_model(title="asdfasdf", field2="laksdj"...) 包裹在一堆 "for x in range(0,200):" 循环里),但因为结果和我预期的不一样,我放弃了。我觉得这个是我需要用的,但这是不是需要数据库里已经有数据才能工作呢?
6 个回答
Django的数据填充功能可以帮助我们在使用syncdb
时导入数据。不过,通常通过Python代码来进行初始数据的导入会更简单。你提到的方法应该是可行的,可以通过syncdb或者管理命令来实现。例如,在my_app/management.py
文件中:
def init_data(sender, **kwargs):
for i in range(1000):
MyModel(number=i).save()
signals.post_syncdb.connect(init_data)
或者,在myapp/management/commands/my_command.py
中的一个管理命令里:
from django.core.management.base import BaseCommand, CommandError
from models import MyModel
class MyCommand(BaseCommand):
def handle(self, *args, **options):
if len(args) > 0:
raise CommandError('need exactly zero arguments')
for i in range(1000):
MyModel(number=i).save()
然后你可以把这些数据导出为一个数据填充文件,或者继续使用管理命令来导入数据。如果你选择继续使用syncdb
信号,你需要有条件地运行init_data
函数,以避免在后续的syncdb
调用中重复导入数据。当数据填充不够用时,我个人喜欢同时做两件事:创建一个管理命令来导入数据,同时让第一次调用syncdb
时自动进行导入。这样一来,部署过程就更自动化了,但我仍然可以轻松修改初始数据并重新运行导入。
你可以使用“固定数据”(fixtures)来实现这个目的,还有一个叫做 loaddata 的管理命令。
一种做法是这样进行:
准备好你的测试数据库。
使用 dumpdata 命令把数据库导出为 JSON 格式。
把这个导出的文件放到你应用的
fixtures
目录里。编写单元测试来加载这个“固定数据”: https://docs.djangoproject.com/en/2.2/topics/testing/tools/#django.test.TransactionTestCase.fixtures
看看这个应用
https://github.com/aerosol/django-dilla/
假设你用Django写了一个博客应用(没错,就是你最喜欢的那个!)。单元测试都通过了,一切运行得非常快,甚至那些ORM生成的超长查询也没问题。你添加了几个分类的帖子,应用依然稳定得像块石头。你很确定这个应用效率高,准备好上线了,对吧?错了。