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

时间:2017-05-16 16:28:29

标签: sql django database django-models model

通常我们只使用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(),没有任何问题,但有一天我不想感到惊讶。此外,由于某些原因必须传递参数,对吗?

3 个答案:

答案 0 :(得分:1)

答案是你知道什么时候需要:) 现在求助于这种做法

类MyModel(models.Model):

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

通过这种方式,您可以确保不会意外丢弃任何神秘的参数。但是,让我们试着揭开他们中的一些神秘面纱。

使用= self._db

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

update_fields

  

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

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

因此,源代码的链接是他们使用此功能的特定实例。非常有用,可以跟踪用户上次登录的时间而不更新整个记录。

force_insert vs force_update

这些告诉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']),则数据库中的所有值都将被您对该实例的缓存引用的值覆盖,从而导致信息丢失。