首页 > 解决方案 > 我已经重写了 save() 方法,但新代码仅应用于新记录

问题描述

我需要标题为小写。我覆盖了save()方法并包含self.title.lower(),这对我创建的任何新记录都非常有用。但是当我修改现有记录时,标题不会变成小写吗?有谁知道为什么?或者有人可以指点我相关文档的方向吗?

我的表中有一个多对多字段,我应该更新我的m2m_changed信号以包含解决问题的代码吗?

def save(self, *args, **kwargs):
if not self.slug:
    self.slug = unique_slug_generator(self)
    self.title = self.title.lower()
            
    super(CategoryTree, self).save(*args, **kwargs)  
else:
    super(CategoryTree, self).save(*args, **kwargs)  

标签: pythonpython-3.xdjango

解决方案


根据您的代码,仅当实例没有 a 时才会降低标题slug,这通常是在创建对象时。因此,我建议在整个表中使用更新操作

from django.db.models.functions import Lower

CategoryTree.objects.update(title=Lower('title'))

请注意,这是一次性操作,它将每个title值更新为相应的小写值。

或者,您可以将save(...)方法修改为

def save(self, *args, **kwargs):
    if not self.slug:
        self.slug = unique_slug_generator(self)

    if not self.title.islower():
        self.title = self.title.lower()

    super(CategoryTree, self).save(*args, **kwargs)

推荐阅读