Django中的initial_data固定件管理
我正在做的django项目里有很多初始数据的固定数据。看起来默认情况下,自动加载数据的唯一方法就是在你的应用文件夹里放一个叫做 fixtures
的文件夹,并且这个文件夹里必须有一个文件,名字要叫 initial_data.ext
(其中的 ext 可以是 xml、json、yaml 或其他格式)。
我觉得这样不太灵活。我更希望能有一个 fixtures 文件夹,然后在里面再有一个 initial_data 文件夹,接着在那个文件夹里为每个模型放一个文件。或者类似这样的结构。现在在django里可以这样做吗?或者有没有其他更好的固定数据组织方式?
4 个回答
是的,你可以把数据文件分成多个文件,并且可以放在子文件夹里。你可以指定要加载的数据文件,并创建一个脚本来加载其中一些或全部文件。我之前做过这个,所以可以确认它是有效的。
举个例子:django-admin.py loaddata application/module/model.json
想了解更多信息,可以查看loaddata
的文档。
你可以随意调整你最初的数据准备内容,然后写一个叫做 post_syncdb
的信号处理器来加载这些数据。这样,当你运行 syncdb
的时候,这些数据就会按照你定义的逻辑自动加载进来。
查看详细信息: https://docs.djangoproject.com/en/1.3/ref/signals/#post-syncdb
根据我的经验,硬编码的测试数据写起来很麻烦,维护起来也很麻烦。每当模型发生变化导致测试数据出错时,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会自动为你创建书模型所需的任何依赖。这只是一个简单的例子,但这个库可以处理非常复杂的模型结构。