我一直在和South合作开展一个新的Django项目。
我刚刚添加了一个新模型Client
,我想确保任何运行的测试或任何新的数据库设置总是填充{{1所以我在项目的Client
中添加了一个新实例。
现在每当我运行测试或填充新数据库时,看起来initial_data.json
正在加载两次 - 一旦首次创建表后。 (失败并带有追溯)。在迁移应用之后第二次。 (成功就好了)
例如,运行initial_data.json
会给我以下输出:
manage.py syncdb --migrate --noinput
或者,如果我在以下测试中运行Syncing...
Creating tables ...
<snip>
Installing custom SQL ...
Installing indexes ...
Problem installing fixture 'initial_data.json': Traceback (most recent call last):
File ".../django/core/management/commands/loaddata.py", line 174, in handle
obj.save(using=using)
File ".../django/core/serializers/base.py", line 165, in save
models.Model.save_base(self.object, using=using, raw=True)
File ".../django/db/models/base.py", line 522, in save_base
manager.using(using).filter(pk=pk_val).exists())):
File ".../django/db/models/query.py", line 496, in exists
return self.query.has_results(using=self.db)
File ".../django/db/models/sql/query.py", line 424, in has_results
return bool(compiler.execute_sql(SINGLE))
File ".../django/db/models/sql/compiler.py", line 735, in execute_sql
cursor.execute(sql, params)
File ".../django/db/backends/util.py", line 34, in execute
return self.cursor.execute(sql, params)
File ".../django/db/backends/sqlite3/base.py", line 234, in execute
return Database.Cursor.execute(self, query, params)
DatabaseError: no such table: core_client
Migrating...
Running migrations for core:
<snip>
- Loading initial data for assetcloud.
Installed 5 object(s) from 1 fixture(s)
:
manage.py test SouthProblems
我会得到这个输出:
class SouthProblems(TestCase):
def test_south_problems(self):
print Client.objects.all()
在这两种情况下,初始数据似乎都已成功创建,但我得到了不必要的追溯。
我想知道我是不是正确使用南方。初始数据夹具?
我还跟踪了这张票:http://south.aeracode.org/ticket/372这听起来像我所看到的,但那是18个月前,票证被标记为固定。
我正在运行Django 1.3和South 0.7.3
修改
我也看到了这一点:http://south.aeracode.org/docs/commands.html#initial-data-and-post-syncdb虽然我不完全确定文档说明是否应该看到South尝试在应用任何迁移之前加载灯具。
有这个https://groups.google.com/d/topic/south-users/PWpQn61UDmI/discussion,这表明使用initial_data对南方来说可能不是一个明智的事情,但是我有点惊讶我没有看到其他地方提到的那个东西?...(我'我也在那里向列表中发布了一个问题,但它正在等待审核)
答案 0 :(得分:7)
建议的解决方案是不要使用South的初始数据夹具,而是从迁移内部调用loaddata:
在Google网上论坛中查看此讨论 - link
答案 1 :(得分:0)
遗憾的是,自从django 1.6以来,这已不再适用了。