Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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
Python 在获取或创建保存到数据库之前,如何调用clean方法?_Python_Django_Django Models - Fatal编程技术网

Python 在获取或创建保存到数据库之前,如何调用clean方法?

Python 在获取或创建保存到数据库之前,如何调用clean方法?,python,django,django-models,Python,Django,Django Models,我在Django有一个模型,其中一些数据经常无效。通常我调用我为处理这些情况而编写的clean()方法,然而,get\u或\u create()似乎在我有机会调用clean()之前调用了save() 在get\u或\u create()尝试写入数据库之前,如何清理我的数据 以下是我的模型的相关部分: class Article(models.Model): optional_attribute = models.CharField(max_length = 250) def c

我在Django有一个模型,其中一些数据经常无效。通常我调用我为处理这些情况而编写的
clean()
方法,然而,
get\u或\u create()
似乎在我有机会调用
clean()
之前调用了
save()

get\u或\u create()
尝试写入数据库之前,如何清理我的数据

以下是我的模型的相关部分:

class Article(models.Model):
    optional_attribute = models.CharField(max_length = 250)

    def clean(self):
        if not self.optional_attribute:
            self.optional_attribute = 'Default'

更合适的做法可能是:

或者,您可以使用信号处理程序:

from django.db.models.signals import pre_save

class Article(models.Model):
    optional_attribute = models.CharField(max_length = 250)

    @classmethod
    def pre_save_handler(cls, sender, instance, **kwargs):
        if not instance.optional_attribute:
            instance.optional_attribute = 'Default'

pre_save.connect(Article.pre_save_handler, sender=Article)

如果你想保留你的
clean
方法,你可以简单地使用其中一种技术,从内部调用你的
clean
方法。

获取或创建
方法只是一个快捷方式。如果要清理对象,可以稍微详细地编写代码

try:
    article = Article.objects.get(**params)
except Article.DoesNotExist:
    article = Article(**params) 
    article.full_clean()
    article.save()

使用
pre_save
方法而不是覆盖
save
方法是否有好处?无论哪种方式,我都可能在一种方法中调用我的
clean
方法。如果我最终需要一个
ValidationError
,那就太好了。覆盖
save
和我知道的
pre_save
信号之间没有任何功能上的区别。重写
save
更像传统的python风格,
pre_save
信号更像是django-way。请注意,更复杂,因为它考虑了上面简单版本中隐含的竞争条件。
try:
    article = Article.objects.get(**params)
except Article.DoesNotExist:
    article = Article(**params) 
    article.full_clean()
    article.save()