为什么 django 的 `apps.get_model()` 返回一个 `__fake__.MyModel` 对象

Alg*_*ra8 5 python django django-models

我正在编写自定义 Django 迁移脚本。根据关于自定义迁移django 文档,我应该能够使用我的模型 vis-a-vis apps.get_model()。但是,在尝试执行此操作时,出现以下错误:

AttributeError: type object 'MyModel' has no attribute 'objects'
Run Code Online (Sandbox Code Playgroud)

我认为这与应用程序注册表尚未准备好有关,但我不确定。

示例代码:

def do_thing(apps, schema_editor):
    my_model = apps.get_model('app', 'MyModel')

    objects_ = my_model.objects.filter(
        some_field__isnull=True).prefetch_related(
        'some_field__some_other_field')  # exc raised here


class Migration(migrations.Migration):

    atomic = False

    dependencies = [
        ('app', '00xx_auto_xxx')
    ]

    operations = [
        migrations.RunPython(do_thing),
    ]
Run Code Online (Sandbox Code Playgroud)

apps.get_model()的返回值的简单打印语句显示如下: <class '__fake__.MyModel'>。我不确定这是什么,是否是没有准备好的结果。

编辑:

我找不到任何资源来解释为什么我得到一个__fake__对象,所以我决定修改代码。我通过抢占appsargs使其工作,如下所示:

def do_thing(apps, schema_editor):
    from django.apps import apps

    my_model = apps.get_model('app', 'MyModel')

    objects_ = my_model.objects.filter(
        some_field__isnull=True).prefetch_related(
        'some_field__some_other_field')  # no more exc raised here
Run Code Online (Sandbox Code Playgroud)

我仍然感到困惑,任何帮助将不胜感激。

mrt*_*rts 11

赝品是历史模型。这是Django 文档的解释:

\n
\n

当您运行迁移时,Django 会根据迁移文件中存储的模型的历史版本进行工作。

\n

[...]

\n

由于不可能序列化任意 Python 代码,因此这些历史模型不会具有您定义的任何自定义方法。但是,它们将具有相同的字段、关系、管理器(仅限于那些具有use_in_migrations = True)和元选项(也有版本控制,因此它们可能与您当前的不同)。

\n
\n

如果objects是自定义管理器,您可以设置use_in_migrations = True使其在迁移中可用。

\n