我们啥时候应该使用 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() 的高级参数?的主要内容,如果未能解决你的问题,请参考以下文章