Django PostgreSQL psycopg2错误:没有唯一约束/InvalidForeignKey

Django PostgreSQL psycopg2错误:没有唯一约束/InvalidForeignKey,django,postgresql,django-models,psycopg2,Django,Postgresql,Django Models,Psycopg2,我有以下型号: 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.ForeignKe

我有以下型号:

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\u contact”的给定键

contacts\u contact
显然在
id
中有一个唯一的约束作为主键


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

您只需一步一步地调试即可。现在,您正试图与数据库中尚未存在的表创建外键关系。因此,除了联系人模型、应用迁移、然后添加事件列表等之外,请将所有内容注释掉。如果您依赖于联系人模型优先的事实,那么,在这种情况下,它没有任何帮助

似乎
EventMembership
必须对字段event\u list和event\u contact具有唯一约束。这当然会在两个字段中都丢弃null=True。@AndreyNelubin是的,但是(作为元唯一约束添加),但这将如何引发错误?如果我删除这个约束,错误仍然存在?谢谢,我不知道这种注释所有内容的方法是如何工作的。请你进一步解释一下好吗?例如,1)导致此错误的原因是什么?2)如何修复此错误?Re:dependencies,这应该已经在迁移文件中解决,您可以看到该文件已首先加载联系人模型抱歉,我错了。实际上,您可以在一次迁移中创建一个模型以及与该模型的关系。我很确定我以前没能做到。我刚试过,效果很好。让我惊讶的是,您没有收到错误
“EventMembership”没有定义,因为它应该在引号中:
到class='EventMembership'
。你确定你的数据库是干净的吗?因为如果您创建了例如Contact table,然后在其上使用了
drop table
,仍然会有许多依赖项。您是否将所有这些模型都放在一个models.py文件中?文档中有一句话可能与您的问题有关:“没有迁移的应用程序不得与具有迁移的应用程序有关系(ForeignKey、ManyToManyField等)。有时它可能有效,但不受支持。”不,它们是单独的应用程序(无法更改此项)。我认为现在的情况是,在
0002_auto
迁移中应用的第一个模型中创建了一个约束需求,第二个模型的依赖关系指向
0001_initial
。但我不知道如何纠正这一点。
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'))
                  ]
                ]