You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django4.0重写模型save方法后is_active字段修改不生效

问题产生原因

核心问题出在你重写的Topic模型save方法逻辑有遗漏:
你只在self.pk is None(即首次创建新对象)的判断分支内调用了super().save(*args, **kwargs)执行实际的数据库写入操作。当你在Django admin后台修改已存在对象的is_active字段时,对象已经有主键值,self.pk is None判断结果为假,整个方法不会执行任何数据库写入逻辑,自然你修改的字段值不会被保存。
你admin配置里的save_model虽然重复调用了obj.save(),但因为模型层的save方法本身在更新场景下不执行库表写入,所以依然不会生效。

修复方案
  • 修正模型层save方法逻辑,把父类save的调用移到新建判断的分支外,保证新建、更新场景都会触发数据库写入,仅将新建对象才需要执行的Kafka主题创建逻辑放在pk判断分支内即可,修正后的代码如下:
# models.py 内的save方法修正
def save(self, *args, **kwargs):
    if self.pk is None:
        print("New object topic")
        topic_name = self.slug
        invoke_kafka_topic_create.delay(topic_name)
    # 无论新建还是更新,都必须执行父类原生save逻辑完成数据持久化
    super().save(*args, **kwargs)
  • (可选优化)调整admin层的save_model实现,直接调用父类的save_model方法完成写入,避免手动调用obj.save()跳过Django admin内置的保存前后逻辑(比如信号发送、变更日志记录等),参考代码:
# admin.py 内的TopicManager修正
class TopicManager(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if getattr(obj, 'created_by', None) is None:
            obj.created_by = request.user
        else:
            obj.modified_by = request.user
        super().save_model(request, obj, form, change)

改完之后重启Django服务,再在admin后台修改字段值就能正常更新了。


内容的提问来源于stack exchange,提问作者Muhammed Fayis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:15:40