difference save() vs create()
create(**kwargs)
A convenience method for creating an object and saving it all in one step. Thus:
p = Person.objects.create(first_name="Bruce", last_name="Springsteen")
and:
p = Person(first_name="Bruce", last_name="Springsteen")
p.save(force_insert=True)
are equivalent.
The force_insert
parameter is documented elsewhere, but all it means is that a new object will always be created. Normally you won’t need to worry about this. However, if your model contains a manual primary key value that you set and if that value already exists in the database, a call to create()
will fail with an IntegrityError
since primary keys must be unique. Be prepared to handle the exception if you are using manual primary keys.
How Django knows to UPDATE vs. INSERT
You may have noticed Django database objects use the same save()
method for creating and changing objects. Django abstracts the need to use INSERT
or UPDATE
SQL statements. Specifically, when you call save()
, Django follows this algorithm:
- If the object's primary key attribute is set to a value that evaluates to
True
(i.e., a value other thanNone
or the empty string), Django executes anUPDATE
. - If the object's primary key attribute is not set or if the
UPDATE
didn't update anything, Django executes anINSERT
.
The one gotcha here is that you should be careful not to specify a primary-key value explicitly when saving new objects, if you cannot guarantee the primary-key value is unused.
In Django 1.5 and earlier, Django did a SELECT
when the primary key attribute was set. If the SELECT
found a row, then Django did an UPDATE
, otherwise it did an INSERT
. The old algorithm results in one more query in the UPDATE
case. There are some rare cases where the database doesn't report that a row was updated even if the database contains a row for the object's primary key value. An example is the PostgreSQL ON UPDATE
trigger which returns NULL
. In such cases it is possible to revert to the old algorithm by setting the select_on_save option to True.
Forcing an INSERT or UPDATE
In some rare circumstances, it's necessary to be able to force the save()
method to perform an SQL INSERT
and not fall back to doing an UPDATE
. Or vice-versa: update, if possible, but not insert a new row. In these cases you can pass the force_insert=True
or force_update=True
parameters to the save()
method. Obviously, passing both parameters is an error: you cannot both insert and update at the same time!
It should be very rare that you'll need to use these parameters. Django will almost always do the right thing and trying to override that will lead to errors that are difficult to track down. This feature is for advanced use only.
Using update_fields
will force an update similarly to force_update
.
Explicitly specifying auto-primary-key values
>>> b3 = Blog(id=3, name='Cheddar Talk', tagline='Thoughts on cheese.')
>>> b3.id # Returns 3.
>>> b3.save()
>>> b3.id # Returns 3.
If you assign auto-primary-key values manually, make sure not to use an already-existing primary-key value! If you create a new object with an explicit primary-key value that already exists in the database, Django will assume you're changing the existing record rather than creating a new one.
b4 = Blog(id=3, name='Not Cheddar', tagline='Anything but cheese.')
b4.save() # Overrides the previous blog with ID=3!
Explicitly specifying auto-primary-key values is mostly useful for bulk-saving objects, when you're confident you won't have primary-key collision.
网友评论