【问题标题】:How to load initial_data (fixture) after migration and not after syncdb?如何在迁移后而不是在syncdb之后加载initial_data(fixture)?
【发布时间】:2012-05-16 08:53:24
【问题描述】:

我有一个执行syncdbmigratebootstrap 脚本:

import settings
from django.core.management import setup_environ, call_command

setup_environ(settings)                                         # Setting up the env settings
call_command('syncdb', migrate=True, interactive=False)         # Sync the database

先决条件:

  • django-south 用于迁移。

过程发生:

  • initial_data 夹具包含由迁移创建的模型的数据。
  • 执行syncdb 会创建所有表,但存在迁移的应用除外。
  • 发布syncdb 它会尝试加载initial_data 并引发错误 of db not found,因为带有迁移的应用程序表不是由syncdb 创建的。 [问题]
  • 然后它执行创建数据库的迁移。
  • migration这次会自动加载initial_data成功。

问题:

  • error 尝试为尚未创建的表加载夹具时,我该如何摆脱它?
  • 我能否编辑上述脚本,使其仅在执行migration 后才加载initial_data

【问题讨论】:

  • 我猜这就是南不属于 django 的原因之一 :)
  • 看起来像......但如果是这样的话,那么这个问题就会首先得到解决。

标签: python django migration fixtures django-syncdb


【解决方案1】:

您可以在 syncdb 时禁用加载初始数据:

call_command('syncdb', load_initial_data=False, interactive=False)
call_command('migrate', interactive=False)

来自syncdb.py的源码:

# Stealth option -- 'load_initial_data' is used by the testing setup                                                               
# process to disable initial fixture loading.                                                                                      
load_initial_data = options.get('load_initial_data', True)

【讨论】:

  • 从命令行运行syncdb时如何禁用load_initial_data
  • 使用--no-initial-data 开关(也可用于migrate 命令)
【解决方案2】:

有几种方法可以解决这个问题:

  1. 只需调用您要为其填充数据的应用程序,即可从初始数据转储中排除应用程序
  2. 可以试试这个库https://github.com/davedash/django-fixture-magic
  3. 您可以编写自定义管理命令来填充您需要的模型
  4. 也可以使用南http://south.aeracode.org/docs/tutorial/part3.html自带的数据迁移

我个人会选择 1 或 3。对于第一点,将灯具单独存储在灯具文件夹下的每个应用程序中。但是,如果您的模型发生变化,这将很难更新。所以编写自定义管理命令可能是最轻松的。

【讨论】:

    猜你喜欢
    • 2011-09-14
    • 2015-11-28
    • 2015-03-02
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多