2010-12-09 40 views
5

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

我觉得这真的很不灵活。我宁愿有一个fixtures文件夹,然后在里面的initial_data文件夹,然后在那里,该应用程序中的每个模型的一个文件。或者是这个效果。现在可以在django做这个吗?或者可能是其他更好的夹具组织方案。

回答

0

是的,你可以将灯具分成多个子文件夹结构的文件。您可以指定夹具文件来加载并创建加载其中一部分或全部的脚本。我之前做过这件事,所以可以确认它的工作原理。

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

更多信息参见loaddata文档。

+0

是的,但那些灯具不会自动加载到syncdb上...... – priestc 2010-12-09 18:35:33

+0

nbv4:我发现在开发过程中处理此问题最方便的方法是创建数据库重置脚本,该脚本将首先清除数据库(数据库依赖),然后创建数据库结构(syncdb)并最终加载fixture(loaddata)。 – vls 2010-12-09 18:39:02

9

以我的经验,硬编码的灯具是一种痛苦的写作和一种难以维护的方式。无论模型更改何时破坏夹具,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-动态夹具自动为您创建Book模型存在所需的任何依赖关系。这只是一个简单的例子,但库可以处理非常复杂的模型结构。

0

哈克方式来加载额外的initial_data.json或两个是有什么,但灯具文件夹和文件initial_data.json你的Django项目中创建额外的空应用程序。如果您需要在其他应用程序的装置之前加载夹具,则可以将其命名为aa1。如果你需要另一个,你可以命名它aa2。你的目录结构应该是这样的:

aa1/ 
    fixtures/ 
     initial_data.json 

aa2/ 
    fixtures/ 
     initial_data.json 

myrealapp/ 
    fixtures/ 
     initial_data.json 
... 

您需要的应​​用程序添加到INSTALLED_APPSsettings.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,每个灯具将自动按字母顺序加载。

正如我所提到的,这很不方便,但如果您只需要一些额外的initial_data.json文件,并且需要能够控制它们加载的顺序,就可以工作。