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'))
]
]