South似乎两次加载initial_data.json
我最近在一个新的Django项目中使用South。
我刚刚添加了一个新的模型Client
,我想确保每次运行测试或者新建数据库时,都会有一个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()
我会得到这样的输出:
Creating test database for alias 'default'...
Problem installing fixture 'initial_data.json': Traceback (most recent call last):
<snip, as before>
DatabaseError: no such table: core_client
[<Client: example>]
.
----------------------------------------------------------------------
Ran 1 test in 0.013s
OK
在这两种情况下,初始数据似乎都成功创建了,但我却收到了不必要的错误追踪信息。
我在想,是否在使用South时对初始数据的处理不太正确?
我还找到了一条相关的记录: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可能不是和South一起使用的明智选择,但我有点惊讶在其他地方没有看到类似的说法……(我也在那儿发了个问题,但还在等待审核)
2 个回答
很遗憾,从django 1.6版本开始,这个方法就不再有效了。
推荐的解决办法是根本不要在使用South时用初始数据文件,而是在迁移过程中调用loaddata:
可以查看这个Google Groups上的讨论 - 链接