python - 迁移 : django. db.utils.IntegrityError 时出错:列 "primary_language_id"包含空值

标签 python django migrate

我正在处理一个 Django 项目,并使用相同模型的一个 models.ForeignKey 的几个实例制作了一个模型。

class Country(models.Model):
    name = models.CharField(max_length=100)
    primary_language = models.ForeignKey('Language', related_name='primary_language', default="")
    secondary_language = models.ForeignKey('Language', related_name='secondary_language', default="")
    tertiary_language = models.ForeignKey('Language', related_name='tertiary_language', default="")

    def __str__(self):
        return self.name

这是语言模型:
class Language(models.Model):
    name = models.CharField(max_length=50)
    abbreviation = models.CharField(max_length=2)

    def __str__(self):
        return self.name

当做$python3 manage.py makemigration base它工作正常,没有错误。
我已经放置了我认为最重要的 2 个迁移文件。
class Migration(migrations.Migration):

    dependencies = [
        ('base', '0002_country_country_code'),
    ]

    operations = [
        migrations.CreateModel(
            name='Currency',
            fields=[
                ('id', models.AutoField(serialize=False, auto_created=True, verbose_name='ID', primary_key=True)),
                ('name', models.CharField(max_length=50)),
                ('abbreviation', models.CharField(max_length=3)),
            ],
        ),
        migrations.CreateModel(
            name='Language',
            fields=[
                ('id', models.AutoField(serialize=False, auto_created=True, verbose_name='ID', primary_key=True)),
                ('name', models.CharField(max_length=50)),
                ('abbreviation', models.CharField(max_length=2)),
            ],
        ),
        migrations.AddField(
            model_name='country',
            name='phone_country_code',
            field=models.CharField(default='', max_length=7),
        ),
        migrations.AlterField(
            model_name='country',
            name='country_code',
            field=models.CharField(default='', max_length=2),
        ),
        migrations.AddField(
            model_name='country',
            name='primary_language',
            field=models.ForeignKey(to='base.Language', default=''),
        ),
        migrations.AddField(
            model_name='country',
            name='secondary_language',
            field=models.ForeignKey(related_name='secondary_language', to='base.Language', default=''),
        ),
        migrations.AddField(
            model_name='country',
            name='tertiary_language',
            field=models.ForeignKey(related_name='tertiary_language', to='base.Language', default=''),
        ),
    ]

class Migration(migrations.Migration):

    dependencies = [
        ('base', '0006_auto_20151023_0918'),
    ]

    operations = [
        migrations.AddField(
            model_name='country',
            name='primary_language',
            field=models.ForeignKey(default='', related_name='primary_language', to='base.Language'),
        ),
        migrations.AddField(
            model_name='country',
            name='secondary_language',
            field=models.ForeignKey(default='', related_name='secondary_language', to='base.Language'),
        ),
        migrations.AddField(
            model_name='country',
            name='tertiary_language',
            field=models.ForeignKey(default='', related_name='tertiary_language', to='base.Language'),
        ),
        migrations.AlterField(
            model_name='language',
            name='abbreviation',
            field=models.CharField(max_length=2),
        ),
        migrations.AlterField(
            model_name='language',
            name='name',
            field=models.CharField(max_length=50),
        ),
    ]

现在,在运行迁移时,我收到一条我无法弄清楚的错误消息。
我认为这些是堆栈跟踪中重要的行:
johan@johan-pc:~/sdp/gezelligehotelletjes_com$ python3 manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: auth, base, sessions, admin, contenttypes, hotel
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying base.0003_auto_20151023_0912...Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
psycopg2.IntegrityError: column "primary_language_id" contains null values


The above exception was the direct cause of the following exception:

django.db.utils.IntegrityError: column "primary_language_id" contains null values

首先,我没有列“primary_language_id”,但我想这是由 Django 创建的。即使删除整个语言模型和 Country 模型中语言的行,我仍然收到此错误。

有人可以帮我解决这个问题吗?

最佳答案

您已经拥有 Country数据库中的对象。

添加 primary_language_id 时列(代表 primary_language ForeignKey ),这些国家/地区的结果是空的 primary_language (因为您没有指定默认值),这会引发错误(因为您也不允许 primary_language 为空值)。

解决方案取决于您希望迁移工作的方式。您可以添加 blank = Trueprimary_language ForeignKey定义,添加默认值,或者将迁移分解为 3 个迁移(添加带有 blank = True 的列,设置值,删除 blank = True )。

关于python - 迁移 : django. db.utils.IntegrityError 时出错:列 "primary_language_id"包含空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33299710/

相关文章:

mysql - 由于转换记录 : 失败,请求回滚字段 "field_images"

Python对比评测

python - 使用 Flask 测试异常返回码

python - 部署到 heroku 的 Django 错误

mysql - Django queryset 选择在哪里连接

python - "no such table"异常

python - 如何按特定顺序对字符串列表进行排序?

django 选择列表(动态选择)

Django rest 框架 - 无法序列化查询集

django - 基数为 10 的 int() 的无效文字 - django - 已更新