我们啥时候应该使用 save() 的高级参数?

Posted

技术标签:

【中文标题】我们啥时候应该使用 save() 的高级参数?【英文标题】:When should we use the advanced parameters of save()?我们什么时候应该使用 save() 的高级参数? 【发布时间】:2017-10-15 20:30:30 【问题描述】:

通常我们只使用inst.save() 将实例保存到数据库中,但Django 在its source code 中使用user.save(using=self._db)。另外,它使用user.save(update_fields=['last_login'])elsewhere。

这让我有些困惑。更糟糕的是,document for the save() method 非常非常简单:

Model.save(force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None)[source]

如果你想要自定义保存行为,你可以覆盖这个save() 方法。详情请见Overriding predefined model methods。

模型保存过程也有一些微妙之处;见章节 下面。

它甚至没有包含那些参数的解释!

我的问题是:我怎么知道什么时候应该使用save()的高级参数?如果我要实现自定义模型,我肯定会写user.save()

我自己做了几个实验,比如将user.save(using=self._db) 更改为user.save(),并没有出现任何问题,但我不想有一天感到惊讶。另外,由于某些原因,必须传递参数,对吧?

【问题讨论】:

【参考方案1】:

答案是你会知道什么时候需要:) 现在采用这种做法

类 MyModel(models.Model):

def save(self,*args, **kwargs):
   # do whatever
   super(MyModel,self).save(*args,**kwarags)

这样可以确保不会意外丢弃任何这些神秘的参数。但让我们试着揭开其中一些的神秘面纱。

使用=self._db

这是为了便于在单个 django 应用程序中使用多个数据库。大多数应用程序并不真正需要。

更新字段

如果 save() 传递了关键字参数中的字段名称列表 update_fields,仅更新该列表中命名的字段。 如果您只想更新一个或几个字段,这可能是可取的 在一个物体上。将有轻微的性能优势 防止所有模型字段在数据库中更新

https://docs.djangoproject.com/en/1.11/ref/models/instances/

所以指向源代码的链接是他们使用此功能的特定实例。在不更新整个记录的情况下跟踪用户上次登录的时间非常有用。

force_insert 与 force_update

这些告诉 django 尝试强制一个或另一个操作。在https://docs.djangoproject.com/en/1.11/ref/models/instances/也有一定的解释

【讨论】:

【参考方案2】:

user.save(using=self._db)的例子我相信当你只有一个db时是多余的,通常定义为“默认 .这个例子简单的指出,如果你有多个db,你可以在保存的时候传入多个db中的哪个。

【讨论】:

【参考方案3】:

update_fields 在您长时间保留对实例的引用(例如在中间件中)并且数据可能从其他地方更改时也很方便。在这些情况下,您要么必须在实例上执行代价高昂的refresh_from_db() 以从数据库中获取最新数据,要么当您只想覆盖特定属性时,您可以省略refresh_from_db() 调用而只使用save(update_fields=['attr1', 'attr2'])。这将使数据库中的所有其他属性保持不变,除了您指定的属性。如果在这种情况下省略update_fields,数据库中的所有值都将被缓存引用的实例值覆盖,从而导致信息丢失。

【讨论】:

以上是关于我们啥时候应该使用 save() 的高级参数?的主要内容,如果未能解决你的问题,请参考以下文章

《JavaScript高级程序设计》啥时候出版

Firebase:我啥时候应该使用 refreshToken?

《JavaScript高级程序设计》啥时候出版

unix 高级环境编程学完出来能做啥工作??

什么时候应该实现一种简单或高级的排序算法?

RabbitMQ---高级使用