django model中的save()方法

时间:2021-04-16 00:25:43

Model.save(force_insert=Falseforce_update=Falseusing=DEFAULT_DB_ALIASupdate_fields=None)

id和pk

如果一个model里没有显示声明哪一个字段(field)是主键(即在某个字段里声明primary_key=True),则django会自动生成一个名为id的AutoFields作为主键。model里的主键都有一个别名叫做pk(primary_key的缩写),无论这个主键是自动生成的还是我们指定的。使用pk和使用主键的名字是一样的效果。

注意1:对于一个要新加入数据库的model实例,在save()执行之前是无法知道它的id的,因为要算数据库中已有多少个本model才能算出它的id值。

>>> b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.')
>>> b2.id     # Returns None, because b doesn't have an ID yet.
>>> b2.save()
>>> b2.id     # Returns the ID of your new object.

force_update和force_insert

这两个参数一般较少用到,因为save()之后django执行的是UPDATE或者INSERT这两条SQL语句的哪一条,遵循如下算法:

1.如果这个对象已经有主键而且主键的值是True的(即不是None或者空字符串等),就执行UPDATE。

2.如果没有主键或者这条save()不会update任何字段,那么它就INSERT。

只有在某些特定情况下,需要强制save()执行INSERT或UPDATE时才会使force_update=True或force_insert=True(比如我要求能UPDATE就UPDATE,不能我也不取INSERT,那么我就把这个force_update参数设置为True)。

update_fields

用来指定哪些字段需要更新,别的不更新。默认是None,这样所有字段都会更新一遍。有时候字段很多而我们只需要更新很少的字段,可以用这个参数来提高一下效率。注意要给它的是一个可迭代对象(比如list等)。如果给它一个空的可迭代对象,那么就什么都不更新(注意和None不同,如果等于None是更新全部字段)。

一旦update_fields参数不使用默认值None,那么这条save()语句就是强制执行UPDATE的。

product.name = 'Name changed again'
product.save(update_fields=['name'])