Ошибка django при переносе: "Не существует уникального ограничения, соответствующего данным ключам для ссылочной таблицы

Итак, я видел, что появилось много таких вопросов (мало кто ответил), и ни один из них в аспекте Django, который я видел. Я не понимаю, почему я получаю ошибку, я предполагаю, что мне не хватает чего-то в моем декораторе поля или чего-то, чего нет в определении модели. Вот две модели... (одна сокращенно). Я думал, что все сделал правильно с уникальным и первичным ключом, установленным в true в одной таблице, на которую ссылается внешний ключ, но при миграции я получаю эту ошибку:

django.db.utils.ProgrammingError: there is no unique constraint matching given keys for referenced table "swsite_zoneentity"

Редактировать от кода...

class ZoneEntity(models.Model):
    zone_number = models.CharField(max_length=100, primary_key=True)
    mpoly = models.PolygonField() #this should grow and shrink for the most representative one...
    objects = models.GeoManager() 
    created_at=models.DateField(auto_now_add=True)
    updated_at=models.DateField(auto_now=True)

class CesiumEntity(models.Model):
    be_number = models.CharField(max_length=100) #the number assigned to a foot print to distinguish
    #zone_id = models.CharField(max_length=100, null=True, blank=True)
    zone_id = models.ForeignKey('ZoneEntity', null=True, blank=True)

4 ответа

Решение

Codejoy,

Когда вы определяете первичный ключ, он автоматически устанавливается как уникальный. Итак, просто перейдите:

class ZoneEntity(models.Model):
    zone_number = models.CharField(max_length=100, primary_key=True)
    ....

class CesiumEntity(models.Model):
    ...
    zone_id = models.ForeignKey('ZoneEntity', null=True, blank=True)
    ...

Это автоматически свяжет PK ZoneEntity с zone_id!

Если поле, которое вы пытаетесь сделать отношением, НЕ является первичным ключом, тогда вы можете добавить unique=True а также to_field='foo'

 - python manage.py. makemigration
s
Migrations for 'module1':
  0002_auto_20170214_1503.py:
    - Create model CesiumEntity
    - Create model ZoneEntity
    - Add field zone_id to cesiumentity

 - python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, module1, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying module1.0002_auto_20170214_1503... OK

Чтобы решить эту проблему, мне нужно было добавить уникальное ограничение для идентификатора таблицы postgres.

psql <your-database-name>
ALTER TABLE swsite_zoneentity ADD CONSTRAINT zone_unique_id UNIQUE(id);

Как этот ответ

Эта проблема возникает чаще всего из-за того, что вы скопировали или создали свою базу данных из дампа, и где-то было потеряно уникальное ограничение для вашего столбца первичного ключа (а также другие ограничения).

Решение:

      Open your DB with pg4admin or any client,    Databases>your_database>schema>public>tables>your_table right-click   
on the table name, 
Choose Properties 
Select columns tabs 
switch primary key on your pk column
save/exit
run migration again

У меня тоже была такая же проблема при переносе БД с SQLite на PostgreSQL 14.4, даже когда указанный внешний ключ имелprimary_key=Trueнабор.

Удаление старых миграций решило мою проблему.

Другие вопросы по тегам