请求协助:Django-cms与Django 2.0.3集成遇阻
适配Django 2.0.3与django-cms的实操建议
兄弟,我太能共情你这种版本不兼容的崩溃了——刚上手django-cms就碰到Django版本不匹配,改到凌晨还失败,换谁都头大!结合你遇到的问题,给你梳理几个关键方向:
先搞懂
on_delete参数的选择逻辑:
Django 2.0开始强制要求外键、一对一字段必须添加on_delete参数,这个选择完全取决于业务关联逻辑:- 最常用的是
models.CASCADE:如果关联的父对象被删除,当前对象也跟着删除(比如CMS页面删除后,关联的占位符、插件也该一并清理,这种场景就用它) - 若想保留当前对象但清空外键值,需先给外键设
null=True,再搭配models.SET_NULL - 要是完全不想处理关联(不推荐,可能留无效数据),用
models.DO_NOTHING,但要注意数据库可能抛出关联约束错误 - 还有
models.SET_DEFAULT(需外键提前设默认值)、models.SET()(可指定固定值或调用函数)两种选项
针对django-cms的核心逻辑,绝大多数外键关系用CASCADE就不会错。
- 最常用的是
批量修复外键的高效技巧:
你改了20次还失败,大概率是漏了某些分散的外键字段。建议用IDE的全局搜索功能,搜models.ForeignKey(或models.OneToOneField(,把所有没加on_delete的地方逐个修正。举个例子:
原代码:placeholder = models.ForeignKey('cms.Placeholder')修改后:
placeholder = models.ForeignKey('cms.Placeholder', on_delete=models.CASCADE)其他容易踩坑的Django 2.0语法变化:
除了on_delete,还有这些点要注意:- Django 2.0弃用了旧的
url()路由函数,要把django-cms源码里的url()替换成path()(简单路由)或re_path()(正则路由) - 模型
Meta类的ordering字段,Django 2.0要求必须是列表/元组,比如原来的ordering = 'title'要改成ordering = ['title']
- Django 2.0弃用了旧的
逐步排查比一次性修改更高效:
别想着一次性改完全部代码,建议每次修改一小部分后,就运行python manage.py makemigrations和python manage.py migrate,看有没有报错,逐步定位问题——不然改一堆之后报错,根本找不到哪出问题。
内容的提问来源于stack exchange,提问作者askance
相关产品推荐
相关产品推荐

