【发布时间】:2017-11-07 20:20:38
【问题描述】:
我想在从抽象模型继承的所有字段上将 null 和空白设置为 true。
我目前的尝试遵循类似的 SO 问题,例如overriding the 'default' attribute on ABC 和 overriding parent model's attribute,表示这是可能的。从 python 控制台初始化对象时,我得到了所需的运行时行为,但它没有反映在迁移文件或数据库中。
上下文:
我有一个系统模型,我希望能够在其中对某些数据创建特定于客户端的覆盖。我有以下型号:
- 抽象 BaseSystem - 定义可覆盖的字段
- 具体的 SystemOverride - 包含部分覆盖的记录
- 具体系统 - 包含“完整”系统记录。
重要的是使 SystemOverride 中的所有字段都为 null/blank = True,这样只有(由客户端)初始化的字段才会覆盖相关的 System object。
代码:
class BaseSystem(models.Model):
class Meta:
abstract = True
def __init__(self, *args, **kwargs):
super(BaseSystem, self).__init__(args, kwargs)
# Mark all fields with 'override' attribute
for field in self._meta.get_fields():
field.override = True
name = models.CharField(max_length=128)
class System(BaseSystem):
pass
class SystemOverride(BaseSystem):
def __init__(self, *args, **kwargs):
super(SystemOverride, self).__init__(args, kwargs)
# Set all overridable fields to null/blank = True.
for field in self._meta.get_fields():
if(hasattr(field, 'override') and field.override):
field.null = True
field.blank = True
# Override-specific fields
system = models.ForeignKey(System)
makemigrations 的结果:
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='System',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128)),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='SystemOverride',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128)),
('system', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='overide.System')),
],
options={
'abstract': False,
},
),
]
null=True 和 blank=True 尚未添加到 SystemOveride 中的名称字段。
【问题讨论】:
标签: python django inheritance django-models