Django模型save方法重写失效,字段命名规则未生效求助
Django模型save方法修改name字段不生效的解决办法
针对你定义的data模型,重写save方法后name字段未添加"new "前缀的问题,可从以下几个方向排查解决:
确认save方法是否被正确触发
- 若通过Django Admin保存,检查Admin类是否重写了
save_model方法,该方法可能会覆盖模型自身的save逻辑。如果Admin里有自定义save_model,需确保它没有重置name字段,或者在其中调用实例的save()而非直接操作数据库。 - 若通过代码保存,避免使用
Model.objects.filter(...).update(name=...)这种批量更新方式,update()不会触发模型的save方法,必须调用实例的save()才能执行你定义的逻辑。
- 若通过Django Admin保存,检查Admin类是否重写了
优化save方法,确保逻辑正确执行
当前代码每次执行save都会给name加前缀,若实例是从数据库读取后再次保存,会出现重复前缀的问题,同时可以优化逻辑确保只添加一次前缀:class data(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) pj = ArrayField(models.IntegerField(), null=True, blank=True) name = models.CharField(max_length=225) explain = models.TextField(max_length=50, null=True) def save(self, *args, **kwargs): # 仅当name未以"new "开头时添加前缀 if not self.name.startswith("new "): self.name = f"new {self.name}" # Python3中super()无需传参,更简洁 super().save(*args, **kwargs)排查信号(Signal)干扰
检查项目中是否定义了针对data模型的pre_save信号处理函数,这类函数会在模型save方法执行前/后运行,若信号里修改了name字段,会覆盖你在save方法中的操作。验证save方法是否被执行
在save方法中添加打印语句,确认方法是否真的被调用:def save(self, *args, **kwargs): print("data模型的save方法已执行") self.name = f"new {self.name}" super().save(*args, **kwargs)保存实例时查看控制台输出,若没有打印内容,说明
save方法未被触发,需排查调用方式的问题。
内容的提问来源于stack exchange,提问作者Alphonse Prakash
相关产品推荐
相关产品推荐

