difference between objects.create() and object.save() in django orm
u = UserDetails.objects.create(first_name='jake',last_name='sullivan')
u.save()
UserDetails.objects.create()
and u.save()
both perform the same save()
function. What is the difference? Is there any extra check or benefit in using create()
vs save()
?
Similar questions:
- What's the best way to create a model object in Django?
- Django: Difference between save() and create() from transaction perspective
- Django Model() vs Model.objects.create()
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.
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.