Django postgress - 不允许多个主键错误

Fra*_*s N 3 django-models django-database

我正在使用 Postgress 数据库的生产系统上运行迁移,当我运行它时,出现以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

最初,字段creative_user(这是我的扩展用户模型)是一个主键,但将其更改为外键以表达具有许多工作经验的一个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')),
            ],
        ),
]
Run Code Online (Sandbox Code Playgroud)

这表达了体验模型的创建,并且creative_user是模型上的主键。然后将其设为外键后,迁移如下所示:

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'),
    ),
]
Run Code Online (Sandbox Code Playgroud)

正如我所说,这一切都适用于开发,但在 Postgress DB 上迁移认为我有多个主键。谁能告诉我我做错了什么?

谢谢。

小智 5

可能是与迁移顺序更改有关的问题。我的迁移文件中有这个:

\n\n
operations = [\n    migrations.AddField(\n        model_name='unsubscriber',\n        name='id',\n        field=models.AutoField(default=None, primary_key=True, serialize=False),\n        preserve_default=False,\n    ),\n    migrations.AlterField(\n        model_name='unsubscriber',\n        name='phone',\n        field=models.IntegerField(verbose_name='Tel\xc3\xa9fono'),\n    ),\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

在示例中,我想将primary_key从phone更改为名为id的新字段,您可以看到此迁移正在尝试将新字段创建为PK而不更改旧字段。

\n\n

只需将顺序更改为这样就可以:

\n\n
operations = [\n\n        migrations.AlterField(\n            model_name='unsubscriber',\n            name='phone',\n            field=models.IntegerField(verbose_name='Tel\xc3\xa9fono'),\n        ),\n        migrations.AddField(\n            model_name='unsubscriber',\n            name='id',\n            field=models.AutoField(default=None, primary_key=True, serialize=False),\n            preserve_default=False,\n        ),\n    ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

它解决了问题。\n我希望它有帮助。

\n