Python 在获取或创建保存到数据库之前,如何调用clean方法?
我在Django有一个模型,其中一些数据经常无效。通常我调用我为处理这些情况而编写的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
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()