全局使用版本化应用程序注册表中的模型

时间:2016-09-02 10:35:44

标签: django django-models django-migrations

我想在我的迁移中运行一个自定义命令,该命令从其他模块调用函数。这些函数使用了一些模型,正如预期的那样,我遇到了模式版本不匹配(OperationalError: (1054, "Unknown column 'foo' in 'bar'")

如果我在自定义命令中使用这些模型,我将使用apps.get_model('my_app', 'bar')访问模型,但由于这些模型用于外部函数,我不能这样做。

我敢肯定,有人遇到过这个问题,虽然我找不到任何东西。

我在考虑使用unittest.mock.patch装饰器,但感觉不是正确的解决方案。

我想知道是否有更通用的解决方案?

1 个答案:

答案 0 :(得分:2)

版本化的应用注册表无法全局访问。您可以将模型作为参数传递给函数,并使用当前模型作为默认值:

from my_app.models import Bar

def my_function(..., bar_model=Bar):
    # Use bar_model instead of Bar

# Your RunPython function
def migrate_something(apps, schema_editor):
    my_function(bar_model=apps.get_model('my_app', 'bar'))

如果从常规代码中调用bar_model参数,则不必传递apps参数,但从迁移中调用它时,您可以传递历史模型。

如果您需要多个型号,可以改为from django.apps import apps as global_apps def my_function(..., apps=global_apps): Bar = apps.get_model('my_app', 'bar')

<nav class="menu">
    <ul class="lvl1">
        <li class="lvl1"><a href="#">Lorem</a></li>
            <ul class="lvl2">
                <li class="lvl2"><a href="#">Vino</a></li>
                <li class="lvl2"><a href="#">Fino</a></li>
                <li class="lvl2"><a href="#">Dolce</a></li>
                <li class="lvl2"><a href="#">Vita</a></li>
                <li class="lvl2"><a href="#">Mamma Mia</a></li>             
            </ul>
        <li class="lvl1"><a href="#">Ipsum</a></li>
            <ul class="lvl2">
                <li class="lvl2"><a href="#">Vino</a></li>
                <li class="lvl2"><a href="#">Fino</a></li>
                <li class="lvl2"><a href="#">Dolce</a></li>
                <li class="lvl2"><a href="#">Vita</a></li>
                <li class="lvl2"><a href="#">Mamma Mia</a></li>             
            </ul>
        <li class="lvl1"><a href="#">Dolor</a></li>
            <ul class="lvl2">
                <li class="lvl2"><a href="#">Vino</a></li>
                <li class="lvl2"><a href="#">Fino</a></li>
                <li class="lvl2"><a href="#">Dolce</a></li>
                <li class="lvl2"><a href="#">Vita</a></li>
                <li class="lvl2"><a href="#">Mamma Mia</a></li>             
            </ul>
        <li class="lvl1"><a href="#">Sit</a></li>
            <ul class="lvl2">
                <li class="lvl2"><a href="#">Vino</a></li>
                <li class="lvl2"><a href="#">Fino</a></li>
                <li class="lvl2"><a href="#">Dolce</a></li>
                <li class="lvl2"><a href="#">Vita</a></li>
                <li class="lvl2"><a href="#">Mamma Mia</a></li>             
            </ul>
        <li class="lvl1"><a href="#">Amet</a></li>
            <ul class="lvl2">
                <li class="lvl2"><a href="#">Vino</a></li>
                <li class="lvl2"><a href="#">Fino</a></li>
                <li class="lvl2"><a href="#">Dolce</a></li>
                <li class="lvl2"><a href="#">Vita</a></li>
                <li class="lvl2"><a href="#">Mamma Mia</a></li>             
            </ul>
    </ul>
</nav>