Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何覆盖抽象模型的null和空白字段属性_Python_Django_Inheritance_Django Models - Fatal编程技术网

Python 如何覆盖抽象模型的null和空白字段属性

Python 如何覆盖抽象模型的null和空白字段属性,python,django,inheritance,django-models,Python,Django,Inheritance,Django Models,我想在从抽象模型继承的所有字段上将null和blank设置为true 我目前的尝试遵循了类似的SO问题,例如和,它们表示这是可能的。当从python控制台初始化对象时,我获得了所需的运行时行为,但它没有反映在迁移文件或数据库中 背景: 我有一个系统模型,希望能够在其中对某些数据创建特定于客户端的覆盖。我有以下型号: 抽象BaseSystem-定义可重写字段 具体系统覆盖-包含部分覆盖的记录 混凝土系统-包含“完整”系统记录 务必使SystemOverride null/blank=True中

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

我目前的尝试遵循了类似的SO问题,例如和,它们表示这是可能的。当从python控制台初始化对象时,我获得了所需的运行时行为,但它没有反映在迁移文件或数据库中

背景:

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

  • 抽象BaseSystem-定义可重写字段
  • 具体系统覆盖-包含部分覆盖的记录
  • 混凝土系统-包含“完整”系统记录
务必使SystemOverride null/blank=True中的所有字段都为True,以便只有(由客户端)初始化的字段才会重写相关的系统对象

代码:

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中的name字段中。

这无法在类的初始化中完成。makemigrations将永远不会看到它。您需要在元类级别执行此操作。

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

谢谢您的回答,但是您能否详细说明/显示一些如何实现此操作的代码?当您执行makemigration时,您的init不会运行。它在创建类的实例时运行。如果要在创建类之前修改类的属性,请选中modelbase。谢谢你指出这一点。我仍在努力想如何实现这一点。我是否需要覆盖SystemOverride类上的
\uuuuuu new\uuuuuu(cls,name,base,attrs)
方法,以便在属性转到
ModelBase之前修改它们?任何建议都将不胜感激。谢谢你的回答,但是你能详细说明/展示一些如何实现的代码吗?当你进行迁移时,你的init不会运行。它在创建类的实例时运行。如果要在创建类之前修改类的属性,请选中modelbase。谢谢你指出这一点。我仍在努力想如何实现这一点。我是否需要覆盖SystemOverride类上的
\uuuuuu new\uuuuuu(cls,name,base,attrs)
方法,以便在属性转到
ModelBase之前修改它们?任何建议都将不胜感激。谢谢
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,
            },
        ),
    ]