363👍
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.
64👍
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()
does-
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).
-
-
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:
- [Django]-Django ignores router when running tests?
- [Django]-Mixin common fields between serializers in Django Rest Framework
- [Django]-Trying to migrate in Django 1.9 — strange SQL error "django.db.utils.OperationalError: near ")": syntax error"
24👍
The two syntaxes are not equivalent and it can lead to unexpected errors.
Here is a simple example showing the differences.
If you have a model:
from django.db import models
class Test(models.Model):
added = models.DateTimeField(auto_now_add=True)
And you create a first object:
foo = Test.objects.create(pk=1)
Then you try to create an object with the same primary key:
foo_duplicate = Test.objects.create(pk=1)
# returns the error:
# django.db.utils.IntegrityError: (1062, "Duplicate entry '1' for key 'PRIMARY'")
foo_duplicate = Test(pk=1).save()
# returns the error:
# django.db.utils.IntegrityError: (1048, "Column 'added' cannot be null")
- [Django]-How to deal with "SubfieldBase has been deprecated. Use Field.from_db_value instead."
- [Django]-Django: guidelines for speeding up template rendering performance
- [Django]-Why does DEBUG=False setting make my django Static Files Access fail?
14👍
UPDATE 15.3.2017:
I have opened a Django-issue on this and it seems to be preliminary accepted here:
https://code.djangoproject.com/ticket/27825
My experience is that when using the Constructor
(ORM
) class by references with Django 1.10.5
there might be some inconsistencies in the data (i.e. the attributes of the created object may get the type of the input data instead of the casted type of the ORM object property)
example:
models
class Payment(models.Model):
amount_cash = models.DecimalField()
some_test.py
– object.create
Class SomeTestCase:
def generate_orm_obj(self, _constructor, base_data=None, modifiers=None):
objs = []
if not base_data:
base_data = {'amount_case': 123.00}
for modifier in modifiers:
actual_data = deepcopy(base_data)
actual_data.update(modifier)
# Hacky fix,
_obj = _constructor.objects.create(**actual_data)
print(type(_obj.amount_cash)) # Decimal
assert created
objs.append(_obj)
return objs
some_test.py
– Constructor()
Class SomeTestCase:
def generate_orm_obj(self, _constructor, base_data=None, modifiers=None):
objs = []
if not base_data:
base_data = {'amount_case': 123.00}
for modifier in modifiers:
actual_data = deepcopy(base_data)
actual_data.update(modifier)
# Hacky fix,
_obj = _constructor(**actual_data)
print(type(_obj.amount_cash)) # Float
assert created
objs.append(_obj)
return objs
- [Django]-Django: Record with max element
- [Django]-How to understand lazy function in Django utils functional module
- [Django]-Missing Table When Running Django Unittest with Sqlite3
6👍
Model.objects.create()
creates a model instance and saves it. Model()
only creates an in memory model instance. It’s not saved to the database until you call the instance’s save()
method to save it. That’s when validation happens also.
- [Django]-Python Django Gmail SMTP setup
- [Django]-Django.contrib.gis.db.backends.postgis vs django.db.backends.postgresql_psycopg2
- [Django]-South migration: "database backend does not accept 0 as a value for AutoField" (mysql)