我正在研究的django项目有大量的initial_data fixture数据。默认情况下,自动加载数据的唯一方法是在app文件夹中有一个名为fixtures
的文件,文件需要命名为initial_data.ext
(ext为xml或json或yaml等等)。
我认为这真的很难实现。我宁愿有一个fixtures文件夹,然后在一个initial_data文件夹里面,然后在那里,为该应用程序中的每个模型一个文件。或者那种效果。现在这可以在django做吗?或者也许是其他一些更好的夹具组织方案。
答案 0 :(得分:9)
根据我的经验,硬编码的灯具是一种痛苦的写作和维护的痛苦。只要模型更改破坏了一个夹具,Django初始加载将返回一个非常不友好的错误消息,你最终会在Django核心中添加一堆print,以便找到问题的来源。
我与之合作的一位开发人员开发了一个非常好的库来克服这个问题,它被称为django-dynamic-fixture我们真的很喜欢它。以下是它的工作原理:
假设你有这个模型:
class Author(models.Model):
name = models.CharField()
class Book(models.Model):
author = models.ForeingKey(Author, required=True)
title = models.CharField()
要在测试中创建图书实例,您只需要
from django_dynamic_fixture import get
from app import Book
class MyTest(TestCase):
def setUp(self):
self.book = get(Book)
django-dynamic-fixture会自动为您创建Book模型所需的任何依赖项。这只是一个简单的例子,但库可以处理非常复杂的模型结构。
答案 1 :(得分:2)
您可以根据需要重新组织初始数据夹具,然后编写一个加载它们的post_syncdb
信号处理程序。因此,它将根据您定义的逻辑自动加载到syncdb
。
请参阅:https://docs.djangoproject.com/en/1.3/ref/signals/#post-syncdb
答案 2 :(得分:0)
是的,您可以使用子文件夹结构将灯具拆分为多个文件。您可以指定要加载的夹具文件,并创建一个加载其中一部分或全部的脚本。我之前已经这样做了,所以可以确认它是有效的。
示例:django-admin.py loaddata application/module/model.json
有关详细信息,请参阅loaddata
文档。
答案 3 :(得分:0)
加载一个或多个initial_data.json的一种hacky方法是在Django项目中创建除了fixtures文件夹和initial_data.json文件之外的其他空应用程序。如果您需要在其他应用程序之前加载夹具'灯具,你可以命名为aa1
。如果您需要另一个,可以将其命名为aa2
。您的目录结构如下所示:
aa1/
fixtures/
initial_data.json
aa2/
fixtures/
initial_data.json
myrealapp/
fixtures/
initial_data.json
...
您需要将应用添加到INSTALLED_APPS
中的settings.py
。
然后,您可以根据需要使用任意应用信息填充fixture_data.json文件:
(virtualenv) ./manage.py dumpdata --indent=4 auth > aa1/fixtures/initial_data.json
(virtualenv) ./manage.py dumpdata --indent=4 oauth2 > aa2/fixtures/initial_data.json
(virtualenv) ./manage.py dumpdata --indent=4 myrealapp > myrealapp/fixtures/initial_data.json
当您运行python manage.py syncdb
时,每个灯具将按字母顺序自动加载。
正如我所提到的,这非常hacky,但是如果你只需要一些额外的initial_data.json文件并且需要能够控制它们被加载的顺序,那么这就行了。