Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型如何保存已清理的数据?_Django_Django Models - Fatal编程技术网

Django模型如何保存已清理的数据?

Django模型如何保存已清理的数据?,django,django-models,Django,Django Models,我已经看到了其中的点点滴滴,但是我很难把它们全部放在一起。假设我有一个带有字段的模型: class MyModel(models.Model): my_field = models.CharField(...) 我想删除my_字段中的所有“x”并保存它: def clean(self): x_less = self.my_field.replace('x', '') 如何使x_less进入save方法?或者如何保存清理后的数据 def save(self, *args, **

我已经看到了其中的点点滴滴,但是我很难把它们全部放在一起。假设我有一个带有
字段的
模型

class MyModel(models.Model):
    my_field = models.CharField(...)
我想删除
my_字段中的所有“x”并保存它:

def clean(self):
    x_less = self.my_field.replace('x', '')
如何使
x_less
进入
save
方法?或者如何保存清理后的
数据

def save(self, *args, **kwargs):
    self.my_field = x_less #??????
    super().save(*args, **kwargs)
如果有一个好的教程,我错过了什么地方,请让我知道。谢谢。

更新: 您必须从clean方法返回:

def remove_x(self):
    x_less = self.my_field.replace('x', '')
    return x_less
并在save方法中分配返回值:

def save(self, *args, **kwargs):
    self.my_field = self.remove_x()
    super().save(*args, **kwargs)
旧答案,但仍然有用 让用户提供一些输入,然后在没有事先警告的情况下更改该输入,这将导致糟糕的用户体验

遵循您的示例用例:如果您不希望
x
s出现在输入中,请为该字段提供验证器:

def x_validator(value):
    if 'x' in value:
        raise ValidationError(
            "x character is no allowed.",
            params={'value': value}
        )

class MyModel(models.Model):
    my_field = models.CharField(validators=[x_validator], ...)

也就是说,如果要在保存之前或之后修改模型实例。查看到和信号。

我正在使用它从数字中删除分组标记,以节省数据库中的空间。我在str方法中重新分配这些标记。因为数字是一个设定的长度,它会在中的标记处抛出一个max_length错误。@CarlBrubaker,为了回答您的确切问题,我发布了一个更新,但我真的鼓励您查看post_save pressave_信号。另外,您应该在点击模型之前清理数据,可能是在表单的clean方法中?最后一个问题,这不会影响模型上的其他字段,对吗?@CarlBrubaker不会,但请注意,在我的回答中,我将方法名称从
clean
更改为
remove\x
,因为clean是一种用于验证的
models.Model
方法。