【问题标题】:PostgreSQL psycopg2 error: there is no unique constraint / InvalidForeignKeyPostgreSQL psycopg2 错误:没有唯一约束 / InvalidForeignKey
【发布时间】:2020-06-22 17:56:38
【问题描述】:

我有以下型号:

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作为主键。

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

【问题讨论】:

  • 似乎EventMembership 必须对字段 event_list 和 event_contact 具有唯一约束。这当然会在两个字段中丢弃 null=True。
  • @AndreyNelubin 是的,但是(作为元唯一约束添加)但是这将如何引发错误?如果我删除此约束,错误仍然存​​在?

标签: django postgresql django-models psycopg2


【解决方案1】:

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

【讨论】:

  • 谢谢,我不明白这种注释掉所有内容的方法是如何工作的。请你能进一步解释一下吗?例如。 1) 是什么导致了这个错误?,2) 我该如何解决?
  • Re:依赖关系,这应该已经在迁移文件中解决了,你可以看到已经先加载了Contact模型
  • 对不起,我错了。实际上,您可以在一次迁移中创建一个模型以及与该模型的关系。我很确定我以前没有这样做过。我刚试了一下,效果很好。令我惊讶的是您没有收到错误'EventMembership' is not defined,因为它应该用引号括起来:through='EventMembership'。你确定你的数据库是干净的吗?因为如果你创建了例如联系表,然后在上面使用drop table,仍然会留下很多依赖。
  • 您是否在一个 models.py 文件中拥有所有这些模型?文档中有一段引用可能与您的问题有关:“没有迁移的应用不得与有迁移的应用有关系(ForeignKey、ManyToManyField 等)。有时它可能有效,但不受支持。”
  • 不,它们是独立的应用程序(无法更改)。我认为正在发生的事情是在第一个模型中创建了一个约束要求,该约束要求应用于0002_auto 迁移,而第二个模型的依赖项指向0001_initial。我不确定如何纠正这个问题。
猜你喜欢
  • 2016-08-03
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 2016-08-13
  • 1970-01-01
  • 2018-11-24
相关资源
最近更新 更多