Model.
save
(force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_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'])