gpt4 book ai didi

python - 如何覆盖抽象模型的空字段属性

转载 作者:行者123 更新时间:2023-12-05 07:42:33 25 4
gpt4 key购买 nike

我想在从抽象模型继承的所有字段上将 null 和 blank 设置为 true。

我目前的尝试遵循类似的 SO 问题,例如overriding the 'default' attribute on ABCoverriding parent model's attribute ,这说这是可能的。从 python 控制台初始化对象时,我得到了所需的运行时行为,但它没有反射(reflect)在迁移文件或数据库中。

上下文:

我有一个系统模型,我希望能够在其中对某些数据创建特定于客户端的覆盖。我有以下型号:

  • 抽象 BaseSystem - 定义可覆盖字段
  • 具体的 SystemOverride - 包含部分覆盖的记录
  • 具体系统 - 包含“完整”系统记录。

让 SystemOverride 中的所有字段都为 null/blank = True 很重要,这样只有(由客户端)初始化的字段会覆盖相关的系统对象。

代码:

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 的名称字段。

最佳答案

这不能在类的init 中完成。 makemigrations 将永远看不到它。您需要在元类级别执行此操作。

关于python - 如何覆盖抽象模型的空字段属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44396398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com