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

7
我需要在我的数据库中填充大量的虚拟数据(约200个),以便测试我制作的管理界面,我想知道是否有更好的方法来完成这个任务。昨天我花了大部分时间尝试手动填写它(即通过将类似于这样的东西包装在“for x in range(0,200):”循环中:my_model(title="asdfasdf", field2="laksdj"...)),但最终放弃了,因为它并没有按照我预期的方式工作。我认为这个是我需要使用的,但是你需要在数据库中有(现有的)数据才能使其正常工作吗?

你不需要序列化。你需要在shell中运行以创建初始数据,保存实例,然后使用loaddata将数据库导出到像json这样的fixture格式中:python manage.py dumpdata --format=json --indent=4 appname @Matthew Schinckel最接近此问题的答案。 - hughdbrown
6个回答

7

请检查这个应用程序:

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

假设您使用Django编写了自己喜欢的博客应用程序。单元测试通过,一切运行非常快,即使是ORM生成的超长查询也不例外。您添加了几篇分类文章,并且仍然像石头一样稳定。您相信该应用程序高效并已准备好进行实时部署。对吗?错了。


这正是我一直在寻找的东西。非常感谢! - Enrico Tuvera Jr
@伊阿尔: 你的回复让我无法入睡。 - misterte

6

我只需要添加一些细节。 - S.Lott
https://docs.djangoproject.com/en/2.2/topics/testing/tools/#django.test.TransactionTestCase.fixtures - Matthew Schinckel

3

Django 固定数据 提供了一种在 syncdb 导入数据的机制。然而,通过 Python 代码进行初始数据传播通常更容易。您提出的技术应该能够工作,无论是通过 syncdb 还是管理命令。例如,在 my_app/management.py 中,可以通过 syncdb 实现:

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()

您可以将这些数据导出到fixture中,或者继续使用管理命令进行导入。如果您选择继续使用syncdb信号,您需要有条件地运行init_data函数,以防止在后续的syncdb调用中导入数据。当fixture不足够时,我个人喜欢同时执行两个操作:创建管理命令来导入数据,但第一次syncdb调用会自动导入数据。这样,部署更加自动化,但我仍然可以轻松修改初始数据并重新运行导入。


0

我不确定为什么你需要任何序列化。只要你已经设置好了Django的settings.py文件,指向你的测试数据库,填充测试数据库就不过是保存模型而已。

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

有更好的方法来做这件事,但如果你想要一个快速测试集,这是可行的方式。


你是在 shell 的上下文中运行的,对吧?python manage.py shell - hughdbrown

0
我建议你使用django-autofixtures。我尝试过django_seed和django-autofixtures,但是django_seed在唯一键方面存在许多问题。 django-autofixtures会在填充数据库时处理唯一、主要和其他数据库约束。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接