我正在做一个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时,它工作得很好,没有错误。我把我认为最重要的两个迁移文件放了进去。
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创建的。即使在删除整个语言模型和国家/地区模型中的语言行时,我仍然收到此错误。
有人能帮我弄清楚这件事吗?
发布于 2015-10-23 18:10:48
您的数据库中已有Country对象。
当您向这些国家/地区添加primary_language_id列(表示primary_language ForeignKey)时,这些国家/地区最终会得到一个空的primary_language (因为您没有指定默认值),这将抛出一个错误(因为您也不允许为primary_language提供空值)。
解决方案取决于您希望迁移如何工作。您可以将blank = True添加到primary_language ForeignKey定义中,添加一个默认值,或者将迁移分解为3个迁移(使用blank = True、set values、remove blank = True添加列)。
发布于 2020-12-26 07:46:39
如果你创建了一个表,并填充了它,当你尝试添加另一列时,Django就像这些已经在表中的数据没有这个人试图添加的新字段,结果就搞砸了。我所做的是转到我的表并删除所有数据。一旦我这样做了,我就可以迁移了。如果你有一个很小的表,这可能会起作用,不需要接触迁移。
https://stackoverflow.com/questions/33299710
复制相似问题