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

Django models Django postgress-不允许使用多个主键错误,django-models,django-database,Django Models,Django Database,我正在使用Postgress数据库的生产系统上运行迁移,运行时出现以下错误: django.db.utils.ProgrammingError:表“网站体验”不允许有多个主键 但在我的SQL数据库开发中效果很好。以下是我正在使用的模型: class Experience (models.Model): title = models.CharField(max_length = 60) company = models.CharField(max_length = 60)

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

django.db.utils.ProgrammingError:表“网站体验”不允许有多个主键

但在我的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(这是我的扩展用户模型)是主键,但将其更改为外键,以表示具有许多工作经验的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')),
            ],
        ),
]
这表达了体验模型的创建,并且创造性的用户是模型的主键。然后,将其设置为外键后,迁移过程如下所示:

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上使用,但在Postgress DB上迁移会认为我有多个主键。谁能告诉我我做错了什么


谢谢。

我也遇到了同样的问题,通过删除受影响表创建时的所有迁移文件,然后运行makemigrations和migrate来解决问题

您的迁移文件“0004_体验”创建了一个名为“creative_user”的oneToOneField,该字段被设置为主键。 我的猜测是,从onToOne到OnToMany关系的改变需要在以后的迁移中创建一个新的唯一字段(一个自动递增字段“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'),
    ),
]
在这个示例中,我想将主键从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,
        ),
    ]
它解决了这个问题。
我希望它能有所帮助。

我已删除了除init.py之外的所有迁移文件,并再次运行迁移命令

python manage.py makemigrations
python manage.py migrate appName
这解决了我的问题