django中的initial_data fixture管理

时间:2010-12-09 16:30:01

标签: python django fixture

我正在研究的django项目有大量的initial_data fixture数据。默认情况下,自动加载数据的唯一方法是在app文件夹中有一个名为fixtures的文件,文件需要命名为initial_data.ext(ext为xml或json或yaml等等)。

我认为这真的很难实现。我宁愿有一个fixtures文件夹,然后在一个initial_data文件夹里面,然后在那里,为该应用程序中的每个模型一个文件。或者那种效果。现在这可以在django做吗?或者也许是其他一些更好的夹具组织方案。

4 个答案:

答案 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文件并且需要能够控制它们被加载的顺序,那么这就行了。