Django Model() vs Model.objects.create()
https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects
To create and save an object in a single step, use the
create()
method.
The differences between Model()
and Model.objects.create()
are the following:
INSERT vs UPDATE
Model.save()
does either INSERT or UPDATE of an object in a DB, whileModel.objects.create()
does only INSERT.Model.save()
doesUPDATE 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).
Existing primary key
If primary key attribute is set to a value and such primary key already exists, then
Model.save()
performs UPDATE, butModel.objects.create()
raisesIntegrityError
.Consider the following 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()
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()
Result:
Subject.objects.all().values() <QuerySet [{'subject_id': 1, 'name': 'Math', 'max_marks': 50}]>
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: In the example,
math.save()
does an UPDATE (changesname
from Physics to Math, andmax_marks
from 100 to 50), becausesubject_id
is a primary key andsubject_id=1
already exists in the DB. ButSubject.objects.create()
raisesIntegrityError
, because, again the primary keysubject_id
with the value1
already exists.
Forced insert
Model.save()
can be made to behave asModel.objects.create()
by usingforce_insert=True
parameter:Model.save(force_insert=True)
.
Return value
Model.save()
returnNone
whereModel.objects.create()
return model instance i.e.package_name.models.Model
Conclusion: Model.objects.create()
does model initialization and performs save()
with force_insert=True
.
Excerpt from the source code 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
For more details follow the links:
https://docs.djangoproject.com/en/stable/ref/models/querysets/#create
https://github.com/django/django/blob/2d8dcba03aae200aaa103ec1e69f0a0038ec2f85/django/db/models/query.py#L440