【问题标题】:Error when migrating: django.db.utils.IntegrityError: column "primary_language_id" contains null values迁移时出错:django.db.utils.IntegrityError:列“primary_language_id”包含空值
【发布时间】:2016-01-22 20:02:09
【问题描述】:

我正在处理一个 Django 项目,并制作了一个具有多个模型实例的模型。具有相同模型的外键。

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 创建的。即使删除整个语言模型和国家模型中的语言行,我仍然会收到此错误。

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

【问题讨论】:

  • 你使用的是哪个 Django 版本?
  • @tapinkoira 我有 Django 版本 1.8.5,我使用 Python3

标签: python django migrate


【解决方案1】:

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

当您向它们添加primary_language_id 列(代表primary_language ForeignKey)时,这些国家最终会得到一个空的primary_language(因为您没有指定默认值),这会引发错误(因为您也不允许 primary_language 使用空值)。

解决方案取决于您希望该迁移如何进行。您可以将blank = True 添加到primary_language ForeignKey 定义中,添加一个默认值,或者将您的迁移分解为3 个迁移(添加带有blank = True 的列,设置值,删除blank = True)。

【讨论】:

  • 您好 Thomas,感谢您的快速回复。将 empty=True 添加到外键定义时,makemigration 出现错误,因此无法正常工作。 primary_language = models.ForeignKey('Language', related_name='primary_language', empty=True)。我已经添加了 default="",现在我尝试使用 default=1,因为我指的是由数字表示的 ForeignKey。这也行不通。
  • @JohanVergeer 抱歉,这是blank = True,而不是empty = True。确保您删除现有迁移并重新创建它们。否则您的更改将无法解决迁移问题(他们只会添加更多迁移以在之后运行,这无济于事)。
  • 我试了一下 primary_language = models.ForeignKey('Language', related_name='primary_language', default=1) 但没用。即使注释掉 Country 模型中的所有语言行,我也会收到相同的错误消息。 django.db.utils.IntegrityError:列“primary_language_id”包含空值
  • @JohanVergeer 除非您删除迁移并重新运行makemigrations,否则您对模型的更改不会产生任何影响。你这样做了吗?
  • 我已删除所有迁移并重新运行 makemigrations。这仍然没有奏效。所以我只是删除了数据库并重新安装了它。现在它又可以工作了。
【解决方案2】:

如果你创建了一个表并填充了它,当你尝试添加另一列时,Django 就像表中已经存在的这些数据一样,没有这个人试图添加的这个新字段,它搞砸了。我所做的是去我的桌子并删除所有数据。一旦我这样做了,我就可以迁移。如果您有一个小表,这可能会起作用,无需接触迁移。

【讨论】:

    猜你喜欢
    • 2016-09-11
    • 2015-06-06
    • 2011-04-23
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多