Django迁移中不存在Mixin字段

时间:2017-11-27 11:00:37

标签: python django django-models django-migrations

让我说我有这种混合:

class Test(object):
    ...some logic...

class TestMixin(models.Model):
    db_field = django database field

    test = Test() # not a database field

    class Meta:
        abstract = True

class Foo(TestMixin, models.Model):
    ... more db fields ...

我在这里遇到一个奇怪的问题。如果我通过django shell检查Foo,我可以看到两个字段,db_field和test

但是,如果我创建此迁移:

from __future__ import unicode_literals

from django.db import migrations


def custom_operation(apps, schema_editor):
    Foo = apps.get_model('django_app', 'Foo')
    stuffs = Foo.objects.all()
    for stuff in stuffs:
        print stuff.test # this doesnt exist

class Migration(migrations.Migration):

    dependencies = [
        ...
    ]

    operations = [
        migrations.RunPython(custom_operation),
    ]

如果我在Test() __init__添加一个断点,它将通过shell或Django调用,但在运行迁移时则不会。

通过迁移使用模型之间的区别是什么?

1 个答案:

答案 0 :(得分:3)

https://docs.djangoproject.com/en/1.11/topics/migrations/#historical-models

特别是这句话:

  

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