103👍
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.
17👍
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:
Note: Above answer is from question.
- [Django]-Django 2 – How to register a user using email confirmation and CBVs?
- [Django]-What does Django's @property do?
- [Django]-Get Timezone from City in Python/Django