【问题标题】:Doing X when model is saved保存模型时执行 X
【发布时间】:2012-07-09 04:16:42
【问题描述】:

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

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

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

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

感谢您的任何建议!

【问题讨论】:

  • 这个问题是如果这个模型的 slug 有一个独特的约束,那么你就会遇到问题
  • 在您的代码中使用slugify(self.title) 有什么问题,而不是将其保存在数据库中?如果标题改变了怎么办?无论如何 - 你也可以使用django.db.models.signals.pre_save
  • Tisho,我不想将业务逻辑放在视图中。看来信号是我正在寻找的! :)

标签: django orm django-models model save


【解决方案1】:

最合适的方法是覆盖模型的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

【讨论】:

    【解决方案2】:

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

    管理表格:

    from django.contrib import admin
    
    class ArticleAdmin(admin.ModelAdmin):
    
        prepopulated_fields = {'slug': ('title', )}
    

    模型形式:

    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 修改为唯一。

    【讨论】:

      【解决方案3】:

      您也可以使用信号。使用 django 自带的 post save 信号。 https://docs.djangoproject.com/en/dev/topics/signals/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-30
        • 1970-01-01
        • 2021-01-05
        • 2012-12-23
        相关资源
        最近更新 更多