Django+Postgres删除带评论文章违反外键约束 设CASCADE仍失效问题
解决方案
你配置了on_delete=models.CASCADE仍然触发外键删除报错,是因为Django模型的变更没有同步到PostgreSQL数据库,或是存在其他关联了Post表的模型未配置级联删除,可按以下步骤排查:
- 执行迁移同步模型配置
修改Comment模型的外键规则后,必须执行命令将变更同步到数据库,否则数据库层面的外键约束仍为默认的禁止删除规则:# 生成迁移文件 python manage.py makemigrations # 应用迁移到数据库 python manage.py migrate - 校验数据库外键规则
如果执行迁移后仍报错,可连接PostgreSQL执行以下SQL确认Comment表的外键删除规则:
注意把SELECT constraint_name, delete_rule FROM information_schema.referential_constraints WHERE table_name = 'your_app_name_comment';your_app_name替换为你存放模型的app名称,若返回的delete_rule不是CASCADE,说明迁移未生效,可删除对应app下生成的历史迁移文件(保留__init__.py),重新执行上述迁移命令即可,操作前注意备份数据。 - 排查其他关联表
若Comment表的外键规则已经是CASCADE仍报错,说明有其他业务表(比如点赞、收藏表等)也关联了Post表且未配置级联删除,根据报错提示的外键约束名找到对应表,给对应外键也加上on_delete=models.CASCADE后重新执行迁移即可。
内容的提问来源于stack exchange,提问作者Wazy
相关产品推荐
相关产品推荐

