如果是前后端不分离项目,利用ModelForm的自带属性很容易做到:
- self.data:传递给表单的实际数据。
- self.cleaned_data:验证后清除的数据,包含有资格保存在模型中的数据
- self.changed_data:已更改的字段列表。 如果没有任何变化,它将为空
如果是前后端分离项目,可以使用以下方法来实现:
像这样在模型对象初始化时,记住模型属性值:
class baseModel(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
class meta:
abstract = True
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
fields = [field.attname for field in self._meta.fields]
fields_value_dict = {}
for field in fields:
fields_value_dict[field] = getattr(self, field)
setattr(self._meta, 'original', fields_value_dict)
@property
def changed_data(self):
changed_dict = {}
for field, old_value in self._meta.original.items():
if getattr(self, field) != old_value:
changed_dict[field] = (old_value, getattr(self, field))
return changed_dict
class User(baseModel):
name = models.CharField(max_length=64, verbose_name=_('名称'))
def save(self, **kwargs):
# 在任何你想要的地方调用instance.changed_data即可拿到新旧值
changed_data = self.changed_data
if changed_data:
# do_something



