请检查这个应用程序:
https://github.com/aerosol/django-dilla/
假设您使用Django编写了自己喜欢的博客应用程序。单元测试通过,一切运行非常快,即使是ORM生成的超长查询也不例外。您添加了几篇分类文章,并且仍然像石头一样稳定。您相信该应用程序高效并已准备好进行实时部署。对吗?错了。
准备你的测试数据库。
使用 dumpdata 命令创建数据库的 JSON 导出文件。
将其放置在应用程序的 fixtures
目录下。
编写单元测试以加载这个 "fixture": https://docs.djangoproject.com/en/2.2/topics/testing/tools/#django.test.TransactionTestCase.fixtures
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
调用会自动导入数据。这样,部署更加自动化,但我仍然可以轻松修改初始数据并重新运行导入。
我不确定为什么你需要任何序列化。只要你已经设置好了Django的settings.py文件,指向你的测试数据库,填充测试数据库就不过是保存模型而已。
for x in range(0, 200):
m = my_model(title=random_title(), field2=random_string(), ...)
m.save()
有更好的方法来做这件事,但如果你想要一个快速测试集,这是可行的方式。
python manage.py shell
- hughdbrown
python manage.py dumpdata --format=json --indent=4 appname
@Matthew Schinckel最接近此问题的答案。 - hughdbrown