PostgreSQL ошибка psycopg2: нет уникального ограничения / InvalidForeignKey - PullRequest
0 голосов
/ 10 марта 2020

У меня есть следующие модели:

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 в качестве первичного ключа.

Что может быть причиной этой ошибки? / Как мне отладить это?

1 Ответ

0 голосов
/ 11 марта 2020

Вам просто нужно сделать это шаг за шагом. Теперь вы пытаетесь создать отношение внешнего ключа с таблицей, которой еще нет в базе данных. Поэтому закомментируйте все, кроме модели Contact, примените миграции, а затем добавьте EventList et c. Если вы полагаетесь на тот факт, что модель Contact идет первой, ну, в этом случае это не поможет.

...