我知道我可以覆盖或定义pre_save, save, post_save来在保存模型实例时执行我想要的操作.

在哪种情况下,哪一种更受欢迎?为什么?

推荐答案

我会尽量举例说明:

pre_savepost_save是由模型发送的signals.简而言之,调用模型save之前或之后要采取的动作.

A save triggers the following steps

  • 发出预保存信号.
  • 对数据进行预处理.
  • 大多数字段不进行预处理-字段数据保持原样.
  • 为数据库准备数据.
  • 将数据插入数据库.
  • 发出保存后信号.

Django确实提供了一种覆盖这些信号的方法.

现在

在实际保存到数据库之前,pre_save信号可以被覆盖以进行某些处理-示例:(我不知道在我的头顶哪个地方pre_save比较理想)

假设您有一个ModelA,它存储了对ModelB的所有对象的引用,这些对象已经过not次编辑.为此,您可以在调用ModelBsave方法之前注册一个pre_save信号来通知ModelA(这里也没有什么可以阻止您注册post_save信号).

现在 save method (it is not a signal) of the model is called - By default, every model has a save method, but you can override it:

class ModelB(models.Model):
    def save(self):
        #do some custom processing here: Example: convert Image resolution to a normalized value
        super(ModelB, self).save()

然后,您可以注册post_save信号(这比pre_save更常用)

在系统中创建User个对象时,一个常见的用法是创建UserProfile个对象.

您可以注册一个post_save信号,创建一个UserProfile对象,对应于系统中的每个User.

信号是保持事物模块化、明确化的一种方式.(如果i save或更改ModelB中的内容,请明确通知ModelA)

为了更好地回答这个问题,我将想出更具体的现实世界的例子.同时,我希望这能帮助你

Django相关问答推荐

使用override_sets构建一个预装饰的类,以更快的客户端.登录?

使用FormWizard将信息从视图传递到表单

Htmx如何从事件中访问数据?

如何从Django';S模型中的方法中检索值?

如何在Django模板中为无效词典查找打开异常?

执行官/start.sh:没有这样的文件或目录

NoneType对象没有属性保存Django

如何让两个模型相互引用 Django

何时在 django 中使用 pre_save、save、post_save?

django 管理员登录突然要求 csrf 令牌

Django JSONField 过滤

文档中的 Mongoengine creation_time 属性

测试 Django ModelForm 是否有实例

django excel xlwt

jinja2模板引擎中的这个-是做什么的?

Django:使用 ModelForm 编辑现有数据库条目

Django - 了解 X-Sendfile

在 Django 中使用邮箱地址或用户名登录用户

获取 django 应用的绝对路径

用于创建和更新的基于 Django 类的视图