我正在尝试将提供商上的foreignKey和bestbuy_type上的M2M字段链接起来 - 但是每当我尝试将任何内容保存到这些字段中的任何一个时,我都会收到错误:
(1452, 'Cannot add or update a child row: a foreign key constraint fails (`savingschampion`.`products_masterproduct`, CONSTRAINT `provider_id_refs_id_2ea9c584` FOREIGN KEY (`provider_id`) REFERENCES `products_provider` (`id`))')
字段在我的模型中指定为:
class MasterProduct(BaseModel):
provider = models.ForeignKey('products.Provider', related_name = 'master_products', blank=True, null=True)
bestbuy_type = models.ManyToManyField('products.BestBuy',blank=True, null=True)
...other (no relationship) fields which work fine
使用它确实会在django admin中为字段填充正确的值,但是在保存时会产生错误。
使用MySQL和指定的引擎是:
'ENGINE': 'django.db.backends.mysql'
有谁知道为什么会发生这种情况?
答案 0 :(得分:7)
事实证明,正在创建的新表使用的是InnoDB,而不是像现有表一样使用MyISAM。
将此行添加到我的数据库配置中,通过强制由South创建的新表来使用MyISAM解决了这个问题:
'OPTIONS' : { 'init_command' : 'SET storage_engine=MyISAM', },
答案 1 :(得分:0)
'OPTIONS' : { 'init_command' : 'SET storage_engine=MyISAM', }, <<-- 这对我不起作用,但在清理数据库表中的数据后我想修改它起作用了,尽管这不是一个好方法。
答案 2 :(得分:0)
我已经解决了将所有 MyISAM 类型表转换为 InnoDB 应用此脚本生成的 SQL 命令的相同问题:
SET @DATABASE_NAME = 'name_of_your_db';
SELECT CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables AS tb
WHERE table_schema = @DATABASE_NAME
AND `ENGINE` = 'MyISAM'
AND `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;
然后在 django 设置中使用这个选项:
'OPTIONS' : { 'init_command' : 'SET storage_engine=InnoDB', },
答案 3 :(得分:0)
备份表中的数据,然后从表中删除数据。再次运行迁移它会正常工作。