difference between objects.create() and object.save() in django orm
Similar question: Django Model() vs Model.objects.create()
The difference between Model()
vs Model.objects.create()
are summarized as below.
.save()
perform internally as either INSERT or UPDATE object to db, while.objects.create()
perform only INSERT object to db.Model.save()
perform ....UPDATE → If the object’s primary key attribute is set to a value that evaluates to
True
INSERT → If the object’s primary key attribute is not set or if the UPDATE didn’t update anything (e.g. if primary key is set to a value that doesn’t exist in the database).
If primary key attribute is set to a value then
Model.save()
perform UPDATE butModel.objects.create
raiseIntegrityError
.eg.
models.py
class Subject(models.Model): subject_id = models.PositiveIntegerField(primary_key=True, db_column='subject_id') name = models.CharField(max_length=255) max_marks = models.PositiveIntegerField()
1) Insert/Update to db with
Model.save()
physics = Subject(subject_id=1, name='Physics', max_marks=100) physics.save() math = Subject(subject_id=1, name='Math', max_marks=50) # Case of update math.save()
Output:
Subject.objects.all().values() <QuerySet [{'subject_id': 1, 'name': 'Math', 'max_marks': 50}]>
2) Insert to db with
Model.objects.create()
Subject.objects.create(subject_id=1, name='Chemistry', max_marks=100) IntegrityError: UNIQUE constraint failed: m****t.subject_id
Explanation: Above
math.save()
is case of update sincesubject_id
is primary key andsubject_id=1
exists django internally perform UPDATE, name Physics to Math and max_marks from 100 to 50 for this, butobjects.create() raise IntegrityError
Model.objects.create()
not equivalent toModel.save()
however same can be achieved withforce_insert=True
parameter onsave
method i.eModel.save(force_insert=True)
.
Model.save()
returnNone
whereModel.objects.create()
return model instance i.e.package_name.models.Model
Conclusion: Model.objects.create()
internally do model initialization and perform save
with force_insert=True
.
source-code block of Model.objects.create()
def create(self, **kwargs):
"""
Create a new object with the given kwargs, saving it to the database
and returning the created object.
"""
obj = self.model(**kwargs)
self._for_write = True
obj.save(force_insert=True, using=self.db)
return obj
The following links can be followed for more details:
https://docs.djangoproject.com/en/stable/ref/models/querysets/#create
https://github.com/django/django/blob/2d8dcba03aae200aaa103ec1e69f0a0038ec2f85/django/db/models/query.py#L440
Note: Above answer is from question.
The Django documentation says it is the same. It is just more convenient to make it on one line. You could make a save()
on one line too, but it would be more verbose and less readable -- it is clear you are creating a new object with the create()
method.
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 tocreate()
will fail with anIntegrityError
since primary keys must be unique. Be prepared to handle the exception if you are using manual primary keys.