Django:在clean()方法中获取以前的值

时间:2018-03-09 11:12:21

标签: python django

我有一个带有IntegerField的模型CustomModel

class CustomModel(models.Model):
    count = models.IntegerField()

当我在管理员中创建CustomModel的新实例时,我必须进行验证,因此我使用clean方法并可以访问该值。

def clean(self):
    value = self.count
    ...

我的问题:

当我更改CustomModel的实例时,我只能访问新的更改值,但不能访问原始值。但是,对于我的验证,我必须在实例编辑之前比较新值和值。

我找不到如何获取访问权限的解决方案。有人知道吗?

2 个答案:

答案 0 :(得分:6)

为什么不利用ModelForm?表单数据分两步保存:

  1. 到表单实例
  2. 到模型实例
  3. 所以当你有一个表格时:

    class YourForm(forms.ModelForm):
    
        class Meta:
            model = CustomModel
            fields = ['count',]
    
        def clean(self):
            cleaned_data = super(self).clean()
            count = cleaned_data.get('count')
    
            if count < self.instance.count:
                self.add_error('count', 'You cannot decrease the counter')
    
            return cleanded_data
    

    然后,您可以django管理网站内的override the form

答案 1 :(得分:2)

还有一个只使用模型的解决方案:

def clean(self):
    if self.pk:
        previous_count = self.__class__.objects.get(pk=self.pk).count
    else:
        previous_count = None       # If saving a new instance

self.__class__ 访问模型类并获取当前存储的 .count 值。