Джанго "не удается добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется"



у меня есть модель 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')


Я настроил inlines в admin, поэтому теперь я могу добавлять фотографии В купон от администратора.



Я пытаюсь добавить один, и загрузка успешна, но затем я получаю страницу отладки 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.)



EDIT: я пробовал в базе данных Sqlite3, которая имеет немного другой набор данных, и это сработало, поэтому, возможно, в моей текущей БД есть свободные данные? Как я могу найти его и удалить?

911   6  

6 ответов:

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

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

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

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

для django >= 1.2

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

для django

DATABASE_STORAGE_ENGINE = "MyISAM / INNODB / ETC"

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

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

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

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

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

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

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

другой вариант, это отбросить ограничителем в таблицу MySQL:

alter table <TABLE_NAME> drop foreign key <CONTRAINT_NAME>;

Comments

    Ничего не найдено.