Ошибка 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
набор.
Удаление старых миграций решило мою проблему.