我想在我的迁移中运行一个自定义命令,该命令从其他模块调用函数。这些函数使用了一些模型,正如预期的那样,我遇到了模式版本不匹配(OperationalError: (1054, "Unknown column 'foo' in 'bar'")
。
如果我在自定义命令中使用这些模型,我将使用apps.get_model('my_app', 'bar')
访问模型,但由于这些模型用于外部函数,我不能这样做。
我敢肯定,有人遇到过这个问题,虽然我找不到任何东西。
我在考虑使用unittest.mock.patch
装饰器,但感觉不是正确的解决方案。
我想知道是否有更通用的解决方案?
答案 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>