我在使用Postgres数据库的生产系统上运行迁移,当我运行它时,我收到此错误:
django.db.utils.ProgrammingError:不允许表“website_experience”的多个主键
但在我的开发SQL数据库上运行良好。这是我正在使用的模型:
class Experience (models.Model):
title = models.CharField(max_length = 60)
company = models.CharField(max_length = 60)
city = models.CharField(max_length = 60)
start_date = models.DateField(blank=False, default=datetime.now)
end_date = models.DateField(blank=True, null=True)
description = models.CharField(max_length = 1000)
creative_user = ForeignKey(CreativeUserProfile, models.CASCADE)
最初,字段creative_user(这是我的扩展用户模型)是主键,但将其更改为ForeignKey以表达具有多种工作体验的One CreativeUser之间的一对多关系。
以下是对ForeignKey进行更改之前和之后的迁移
class Migration(migrations.Migration):
dependencies = [
('website', '0003_auto_20170510_1436'),
]
operations = [
migrations.CreateModel(
name='Experience',
fields=[
('title', models.CharField(max_length=60)),
('company', models.CharField(max_length=60)),
('city', models.CharField(max_length=60)),
('startDate', models.DateField()),
('endDate', models.DateField(blank=True, null=True)),
('creative_user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='website.CreativeUserProfile')),
],
),
]
这表示体验模型的创建,而creative_user是模型的主键。然后在将其设为ForeignKey之后,迁移看起来像:
class Migration(migrations.Migration):
dependencies = [
('website', '0004_experience'),
]
operations = [
migrations.AddField(
model_name='experience',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
preserve_default=False,
),
migrations.AlterField(
model_name='experience',
name='creative_user',
field =models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='website.CreativeUserProfile'),
),
]
正如我所说,这一切都适用于dev,但在Postgres DB上进行迁移认为我有多个主键。任何人都可以对我正在做的错误有所了解吗?
谢谢。
我遇到了同样的问题,并设法通过从创建受影响的表中删除所有迁移文件来解决它,然后运行makemigrations并进行迁移。
您的迁移文件“0004_experience”创建了一个名为“creative_user”的oneToOneField,该文件被设置为主键。我的猜测是,从onToOne变为oneToMany关系需要在以后的迁移中创建一个新的唯一字段(自动增量字段“id”并将其设置为主键),因为“creative_user”不再是唯一的。
由于最新的迁移依赖于之前的迁移,因此您最终得到了两个主键。删除这些冲突的迁移文件会将您排除在外。
可能是与迁移顺序有关的问题。我在我的迁移文件中有这个:
operations = [
migrations.AddField(
model_name='unsubscriber',
name='id',
field=models.AutoField(default=None, primary_key=True, serialize=False),
preserve_default=False,
),
migrations.AlterField(
model_name='unsubscriber',
name='phone',
field=models.IntegerField(verbose_name='Teléfono'),
),
]
在示例中,我想将primary_key从phone更改为名为id的新字段,因为您可以看到此迁移正在尝试将新字段创建为PK而不更改旧字段。
只需将订单更改为此必须有效:
operations = [
migrations.AlterField(
model_name='unsubscriber',
name='phone',
field=models.IntegerField(verbose_name='Teléfono'),
),
migrations.AddField(
model_name='unsubscriber',
name='id',
field=models.AutoField(default=None, primary_key=True, serialize=False),
preserve_default=False,
),
]
它解决了这个问题。我希望它有所帮助。