6

我正在研究的 django 项目有大量的 initial_data 固定数据。默认情况下,自动加载数据的唯一方法似乎是在您的应用程序文件夹中有一个名为fixtures的文件,并且该文件需要命名initial_data.ext(ext 是 xml 或 json 或 yaml 或其他东西)。

我认为这真的很不灵活。我宁愿有一个 fixtures 文件夹,然后在里面有一个 initial_data 文件夹,然后在里面,那个应用程序中的每个模型都有一个文件。或者类似的东西。现在可以在 django 中执行此操作吗?或者也许是其他更好的夹具组织方案。

4

4 回答 4

10

以我的经验,硬编码的固定装置很难编写和维护。每当模型更改破坏了固定装置时,Django 初始加载将返回一个非常不友好的错误消息,您最终将在 Django 核心中添加一堆打印以找出问题的来源。

与我一起工作的一位开发人员开发了一个非常好的库来解决这个问题,它被称为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 模型存在所需的任何依赖项。这只是一个简单的示例,但该库可以处理非常复杂的模型结构。

于 2011-07-01T05:10:44.987 回答
2

您可以根据需要重新组织您的初始数据固定装置,然后编写一个post_syncdb加载它们的信号处理程序。因此它将syncdb根据您定义的逻辑自动加载。

请参阅:https ://docs.djangoproject.com/en/1.3/ref/signals/#post-syncdb

于 2011-07-05T16:07:44.300 回答
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_APPSin 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 文件并且需要能够控制它们的加载顺序,那么这很有效。

于 2014-06-29T23:07:42.133 回答
0

是的,您可以将灯具拆分为具有子文件夹结构的多个文件。您可以指定要加载的夹具文件并创建一个脚本来加载其中的部分或全部。我以前做过这个,所以可以确认它有效。

例子:django-admin.py loaddata application/module/model.json

有关更多信息,请参阅loaddata文档。

于 2010-12-09T16:38:48.983 回答