保存模型时执行X.

时间:2012-07-09 18:06:10

标签: django orm django-models model save

保存Django模型时,做X的正确方法是什么?让我试着解释一下。 :)

例如,我有负责博客文章的模型。我想使用title字段来生成slug字段,如果它尚未设置的话。它应该在模型保存之前发生。这就是我目前实现它的方式。

def save(self, *args, **kwargs):
    if self.slug == '':
        self.slug = slugify(self.title)
    super(Article, self).save(*args, **kwargs)

还有其他办法吗?还有其他方法比这更好吗?

感谢任何建议!

3 个答案:

答案 0 :(得分:2)

最合适的方法是覆盖模型的clean方法:

from django.template import defaultfilters

class Article(models.Model):
    ...
    def clean(self):
        if self.slug.strip() == '':
            self.slug = defaultfilters.slugify(self.title)

        super(Article, self).clean()

在保存模型之前,在完成任何唯一性检查之前,将调用此方法,因此如果出现问题,它仍将被捕获。

您可以阅读有关模型的简洁方法here

答案 1 :(得分:1)

我会将其构建到输入表单中并使用ModelAdmin或ModelForm。

管理员表格:

from django.contrib import admin

class ArticleAdmin(admin.ModelAdmin):

    prepopulated_fields = {'slug': ('title', )}

的ModelForm:

class ArticleForm(forms.ModelForm):

    class Meta:
        model = Article

    def clean_slug(self):
       if !self.cleaned_data['slug'] :
           self.cleaned_data['slug'] = slugify(self.title)
       return True

再次在clean_slug中你可能想要检查它是否是唯一的第一个...并且如果不是那么修改slug是唯一的。

答案 2 :(得分:0)

您也可以使用信号。使用django附带的保存后信号。 https://docs.djangoproject.com/en/dev/topics/signals/