让我说我有这种混合:
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调用,但在运行迁移时则不会。
通过迁移使用模型之间的区别是什么?
答案 0 :(得分:3)
https://docs.djangoproject.com/en/1.11/topics/migrations/#historical-models
特别是这句话:
因为序列化任意Python代码是不可能的,所以这些历史模型将没有您定义的任何自定义方法。但是,它们将具有相同的字段,关系,管理器(仅限于use_in_migrations = True)和Meta选项(也是版本,因此它们可能与您当前的不同)。