Django不完整的迁移带有多个外键的表

y53ybaqx  于 2022-12-01  发布在  Go
关注(0)|答案(1)|浏览(115)

Django版本:4.1.2
后升沉模型中定义如下表:

class Tasks(models.Model):
    name_text = models.CharField(max_length=200)
    duration_int = models.IntegerField(default=1)
    ...

定义了下面两个表:

class Metiers(models.Model):
    name_text = models.CharField(max_length=50)
    ...

class TasksProperties(models.Model):
    task = models.ForeignKey(Tasks, on_delete=models.CASCADE, related_name='task_relation')
    metier = models.ForeignKey(Metiers, on_delete=models.CASCADE, related_name='metier_relation')
    ...

在执行迁移时,不会在SQL表中创建元数据,而是创建其余的元数据:

class Migration(migrations.Migration):

    dependencies = [
        ('simo', '0009_alter_specialdays_day_date'),
    ]

    operations = [
        migrations.CreateModel(
            name='Metiers',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name_text', models.CharField(max_length=50)),
            ],
        ),
        migrations.CreateModel(
            name='TasksProperties',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('workload_mh', models.IntegerField(default=8)),
                ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='simo.tasks')),
            ],
        ),
    ]

有没有什么原因,为什么梅蒂埃没有被考虑在内?
2022年11月27日更新:
所以,它仍然不清楚为什么它不工作,因为我相信结构是正确的;因此,我尝试了一些错误,最终迁移完成,尽管原因并不明显。请参见下面的解决方案:
步骤1)从模型中删除迁移的TaskProperties类并执行迁移
步骤2)models.py已更新为

class TasksProperties(models.Model):
    workload_mh = models.IntegerField(default=8)
    metier = models.ForeignKey('Metiers', on_delete=models.CASCADE, related_name='metier_relation')

这导致迁移后,作为外键的“元”在SQL中可见。
步骤3)添加“任务”时,迁移会忽略以下问题:

class TasksProperties(models.Model):
    workload_mh = models.IntegerField(default=8)
    metier = models.ForeignKey('Metiers', on_delete=models.CASCADE, related_name='metier_relation')
    task = models.ForeignKey(Tasks, on_delete=models.CASCADE, related_name='task_relation')
  • 在不指定默认值的情况下,无法将不可为空的字段“task”添加到tasksproperties。这是因为数据库需要填充现有行。请选择修复方法:

1.立即提供一次性默认值(将在此列为空值的所有现有行上设置)
1.退出并在models.py中手动定义默认值。选择一个选项:2个 *
然后,在更新model.py并将默认值default=0添加到“任务”后,迁移成功:

class TasksProperties(models.Model):
    workload_mh = models.IntegerField(default=8)
    metier = models.ForeignKey('Metiers', on_delete=models.CASCADE, related_name='metier_relation')
    task = models.ForeignKey(Tasks, on_delete=models.CASCADE, related_name='task_relation', default=0)

为什么需要此“默认”值?

6yjfywim

6yjfywim1#

请尝试以下三个命令:

python manage.py makemigrations appname

python manage.py sqlmigrate appname 0001

python manage.py migrate

看看能不能解决

相关问题