Django "Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется" - PullRequest
64 голосов
/ 30 мая 2011

У меня есть модель Coupon и модель Photo с ForeignKey:

class Photo(models.Model):
    coupon = models.ForeignKey(Coupon,
                               related_name='description_photos')
    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to='images')

Я установил встроенные функции в админке, чтобы теперь я мог добавлять фотографии в купон от администратора.

Я пытаюсь добавить один, и загрузка успешна, но затем я получаю страницу отладки Django с этой ошибкой:

IntegrityError at /admin/coupon/coupon/321/
(1452, 'Cannot add or update a child row: a foreign key constraint fails (`my_project`.`coupon_photo`, CONSTRAINT `coupon_id_refs_id_90d7f06` FOREIGN KEY (`coupon_id`) REFERENCES `coupon_coupon` (`id`))')

Что это такое и как я могу решить эту проблему?

(Если это имеет значение, это база данных MySQL.)

РЕДАКТИРОВАТЬ: Я пробовал это на базе данных Sqlite3, которая имеет немного другой набор данных, и это сработало, так что, возможно, в моей текущей БД есть свободные данные? Как я могу найти его и удалить?

Ответы [ 6 ]

86 голосов
/ 30 мая 2011

Некоторые из моих таблиц были в InnoDB, а некоторые в MyISAM ... Я изменил все на MyISAM, и проблема была решена.

67 голосов
/ 14 марта 2012
DATABASES = {
'default': {
    ...         
    'OPTIONS': {
         "init_command": "SET foreign_key_checks = 0;",
    },
 }
}

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

19 голосов
/ 27 сентября 2011

Чтобы этого не случилось, вы также можете установить STORAGE_ENGINE в settings.py

для django> = 1.2

DATABASES = {
    'default': {
        ...
        'STORAGE_ENGINE': 'MyISAM / INNODB / ETC'
    }
}

для django <= 1.2 </p>

DATABASE_STORAGE_ENGINE = "MyISAM / INNODB / ETC"

Обратите внимание, что это действительно только для MySQL

4 голосов
/ 16 апреля 2012

Я столкнулся с той же проблемой: решение mmrs151 работает, но NB , что для Django <= 1.2 ( т.е. до поддержки нескольких баз данных) настройка выглядит следующим образом:

DATABASE_OPTIONS = {"init_command": "SET foreign_key_checks = 0;"}

Стоит отметить, что Рам Рахум, похоже, скорее обошел проблему, чем решил: MyISAM вообще не поддерживает транзакции ...

3 голосов
/ 13 апреля 2015

Иногда причиной этой ошибки является попытка сначала сохранить дочернюю таблицу, а затем сохранить родительскую.
Решением для этого является использование.

DATABASES = {
 'default': {
  ...         
 'OPTIONS': {
     "init_command": "SET foreign_key_checks = 0;",
     },
  }
}

2). Проверьте рабочий процесс вашей базы данных и сделайте его parent ---> child

0 голосов
/ 11 июля 2013

Другой вариант - сбросить ограничение в вашей таблице MySQL:

alter table <TABLE_NAME> drop foreign key <CONTRAINT_NAME>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...