我需要用一堆虚拟条目(大约200多个)填充我的数据库,以便我可以测试我已经制作的管理界面,我想知道是否有更好的方法来做到这一点。昨天我花了大部分时间试图用手填充它(即通过将这样的东西包裹起来my_model(title =“asdfasdf”,field2 =“laksdj”......)在一堆“for x in range”中( 0,200):“循环”并放弃,因为它没有像我预期的那样工作。我认为this是我需要使用的,但是你不需要在数据库中有(现有的)数据才能使用吗?
答案 0 :(得分:7)
检查此应用
https://github.com/aerosol/django-dilla/
假设你在Django中写了你的博客应用程序(哦,是的,你最喜欢的!)。单元测试很顺利,一切都运行得非常快,甚至是那些ORM生成的超长查询。你已经添加了几个分类帖子,它仍然像摇滚一样稳定。您非常确定该应用程序是高效的,并且可以进行实时部署。对?错误。
答案 1 :(得分:4)
您可以使用灯具和loaddata管理命令。
一种方法就是这样做。
准备测试数据库。
使用dumpdata创建数据库的JSON导出。
将其放在应用程序的fixtures
目录中。
编写单元测试以加载此“夹具”。
答案 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可用作替代品:
答案 5 :(得分:0)
我会向你推荐django-autofixtures。我尝试了django_seed和django-autofixtures,但是django_seed在使用唯一键时遇到了很多问题。 django-autofixtures在填充数据库时负责处理唯一,主要和其他数据库约束