South似乎两次加载initial_data.json

3 投票
2 回答
1294 浏览
提问于 2025-04-17 00:20

我最近在一个新的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 个回答

0

很遗憾,从django 1.6版本开始,这个方法就不再有效了。

http://south.aeracode.org/ticket/1328

7

推荐的解决办法是根本不要在使用South时用初始数据文件,而是在迁移过程中调用loaddata:

可以查看这个Google Groups上的讨论 - 链接

撰写回答