通常我们只使用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()
,没有任何问题,但有一天我不想感到惊讶。此外,由于某些原因必须传递参数,对吗?
答案 0 :(得分:1)
答案是你知道什么时候需要:) 现在求助于这种做法
类MyModel(models.Model):
def save(self,*args, **kwargs):
# do whatever
super(MyModel,self).save(*args,**kwarags)
通过这种方式,您可以确保不会意外丢弃任何神秘的参数。但是,让我们试着揭开他们中的一些神秘面纱。
这是为了便于在单个django应用程序中使用多个数据库。大多数应用程序并不真正需要。
如果save()传递了关键字参数中的字段名称列表 update_fields,只更新该列表中指定的字段。 如果您只想更新一个或几个字段,这可能是理想的 在一个对象上。将会有轻微的性能优势 阻止在数据库中更新所有模型字段
https://docs.djangoproject.com/en/1.11/ref/models/instances/
因此,源代码的链接是他们使用此功能的特定实例。非常有用,可以跟踪用户上次登录的时间而不更新整个记录。
这些告诉django尝试强制执行一个或另一个操作。在https://docs.djangoproject.com/en/1.11/ref/models/instances/
中也有一定程度的解释答案 1 :(得分:0)
user.save(using=self._db)
的例子我认为只有一个db,通常被定义为“默认值”,这是多余的
。这个例子只是指出如果你有多个dbs,你可以传递多个dbs中的哪一个在保存时使用。
答案 2 :(得分:0)
update_fields
当您长时间保持对实例的引用(例如在中间件中)并且数据可能从其他地方更改时也很方便。在这些情况下,您必须在实例上执行代价高昂的 refresh_from_db()
以从数据库中获取最新数据,或者当您只想覆盖特定属性时,您可以省略 refresh_from_db()
调用并仅使用 { {1}}。这将使数据库中的所有其他属性保持不变,除了您指定的属性。如果您在这种情况下省略 save(update_fields=['attr1', 'attr2'])
,则数据库中的所有值都将被您对该实例的缓存引用的值覆盖,从而导致信息丢失。