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

时间:2009-12-07 02:48:14

标签: python database django

我需要用一堆虚拟条目(大约200多个)填充我的数据库,以便我可以测试我已经制作的管理界面,我想知道是否有更好的方法来做到这一点。昨天我花了大部分时间试图用手填充它(即通过将这样的东西包裹起来my_model(title =“asdfasdf”,field2 =“laksdj”......)在一堆“for x in range”中( 0,200):“循环”并放弃,因为它没有像我预期的那样工作。我认为this是我需要使用的,但是你不需要在数据库中有(现有的)数据才能使用吗?

6 个答案:

答案 0 :(得分:7)

检查此应用

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

假设你在Django中写了你的博客应用程序(哦,是的,你最喜欢的!)。单元测试很顺利,一切都运行得非常快,甚至是那些ORM生成的超长查询。你已经添加了几个分类帖子,它仍然像摇滚一样稳定。您非常确定该应用程序是高效的,并且可以进行实时部署。对?错误。

答案 1 :(得分:4)

您可以使用灯具和loaddata管理命令。

一种方法就是这样做。

  1. 准备测试数据库。

  2. 使用dumpdata创建数据库的JSON导出。

  3. 将其放在应用程序的fixtures目录中。

  4. 编写单元测试以加载此“夹具”。

答案 2 :(得分:3)

Django fixtures提供了一种在syncdb上导入数据的机制。但是,通过Python代码执行此初始数据传播通常更容易。您概述的技术应该可以通过syncdb或管理命令工作。例如,通过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中的management command

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调用自动导入。这样,部署更加自动化,但我仍然可以轻松地修改初始数据并重新运行导入。

答案 3 :(得分:0)

我不确定为什么需要任何序列化。只要您将Django settings.py文件设置为指向测试数据库,填充测试数据库应该只是保存模型。

for x in range(0, 200):
    m = my_model(title=random_title(), field2=random_string(), ...)
    m.save()

有更好的方法可以做到这一点,但如果你想要一个快速测试集,这就是你要走的路。

答案 4 :(得分:0)

已接受答案推荐的应用程序已不再维护,但django-seed可用作替代品:

https://github.com/brobin/django-seed

答案 5 :(得分:0)

我会向你推荐django-autofixtures。我尝试了django_seed和django-autofixtures,但是django_seed在使用唯一键时遇到了很多问题。 django-autofixtures在填充数据库时负责处理唯一,主要和其他数据库约束