首页 > 解决方案 > PostgreSQL psycopg2 错误:没有唯一约束 / InvalidForeignKey

问题描述

我有以下型号:

class Contact(models.Model):
    email = models.EmailField()

class EventList(models.Model):
    event_contacts = models.ManyToManyField(Contact, through=EventMembership)

class EventMembership(models.Model):
    event_list = models.ForeignKey(EventList, null=True, on_delete=models.PROTECT)
    event_contact = models.ForeignKey(Contact, null=True, blank=False, on_delete=models.PROTECT)

但是,在EventMembership完全干净的数据库上应用迁移时,出现以下错误:

psycopg2.errors.InvalidForeignKey:没有唯一约束匹配引用表“contacts_contact”的给定键

class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('lists', '0001_initial'),
        ('contacts', '0002_auto_20200308_2253'),
    ]

    operations = [
       migrations.CreateModel(
            name='EventMembership',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('event_contact', apps.utils.django_multitenant.fields.TenantForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='contacts.Contact')),
                ('event_list', apps.utils.django_multitenant.fields.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='lists.EventList'))
                  ]
                ]

contacts_contact显然具有id作为主键的唯一约束。

什么可能导致此错误?/我该如何调试?

标签: djangopostgresqldjango-modelspsycopg2

解决方案


你只需要一步一步地去做。现在您正尝试与尚未在数据库中的表创建外键关系。因此,除了 Contact 模型,应用迁移,然后添加 EventList 等之外,将所有内容都注释掉。如果您依赖于 Contact 模型首先出现的事实,那么在这种情况下它没有帮助。


推荐阅读