Django - 为测试目的填充数据库

7 投票
6 回答
8996 浏览
提问于 2025-04-15 16:44

我需要在我的数据库里填充一些虚拟数据(大约200条以上),这样我才能测试我做的管理界面。我在想有没有更好的方法来做到这一点。昨天我花了大部分时间试着手动填充数据(也就是像这样用 my_model(title="asdfasdf", field2="laksdj"...) 包裹在一堆 "for x in range(0,200):" 循环里),但因为结果和我预期的不一样,我放弃了。我觉得这个是我需要用的,但这是不是需要数据库里已经有数据才能工作呢?

6 个回答

3

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时自动进行导入。这样一来,部署过程就更自动化了,但我仍然可以轻松修改初始数据并重新运行导入。

6

你可以使用“固定数据”(fixtures)来实现这个目的,还有一个叫做 loaddata 的管理命令。

一种做法是这样进行:

  1. 准备好你的测试数据库。

  2. 使用 dumpdata 命令把数据库导出为 JSON 格式。

  3. 把这个导出的文件放到你应用的 fixtures 目录里。

  4. 编写单元测试来加载这个“固定数据”: https://docs.djangoproject.com/en/2.2/topics/testing/tools/#django.test.TransactionTestCase.fixtures

7

看看这个应用

https://github.com/aerosol/django-dilla/

假设你用Django写了一个博客应用(没错,就是你最喜欢的那个!)。单元测试都通过了,一切运行得非常快,甚至那些ORM生成的超长查询也没问题。你添加了几个分类的帖子,应用依然稳定得像块石头。你很确定这个应用效率高,准备好上线了,对吧?错了。

撰写回答