summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authordmytryi.striletskyi <dmytryi.striletskyi@gmail.com>2018-11-22 22:11:51 +0100
committerTim Graham <timograham@gmail.com>2018-11-27 18:35:19 -0500
commitdcd1025f4c03faa4a9915a1d47d07008280dd3cf (patch)
treecfc3b97da1c2fa54cc893c075a1d28ef6bc1a16d /django
parent926fa7116fd633b69277c3ad9b3370ca45163231 (diff)
Fixed #28385 -- Fixed deserializing natural keys when primary key has a default value.
Co-Authored-By: Hasan Ramezani <hasan.r67@gmail.com>
Diffstat (limited to 'django')
-rw-r--r--django/core/serializers/base.py15
1 files changed, 9 insertions, 6 deletions
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index 624fc312bd..a9c6dbf1dc 100644
--- a/django/core/serializers/base.py
+++ b/django/core/serializers/base.py
@@ -256,15 +256,18 @@ def build_instance(Model, data, db):
If the model instance doesn't have a primary key and the model supports
natural keys, try to retrieve it from the database.
"""
- obj = Model(**data)
- if (obj.pk is None and hasattr(Model, 'natural_key') and
- hasattr(Model._default_manager, 'get_by_natural_key')):
- natural_key = obj.natural_key()
+ default_manager = Model._meta.default_manager
+ pk = data.get(Model._meta.pk.name)
+ if (pk is None and hasattr(default_manager, 'get_by_natural_key') and
+ hasattr(Model, 'natural_key')):
+ natural_key = Model(**data).natural_key()
try:
- obj.pk = Model._default_manager.db_manager(db).get_by_natural_key(*natural_key).pk
+ data[Model._meta.pk.attname] = Model._meta.pk.to_python(
+ default_manager.db_manager(db).get_by_natural_key(*natural_key).pk
+ )
except Model.DoesNotExist:
pass
- return obj
+ return Model(**data)
def deserialize_m2m_values(field, field_value, using, handle_forward_references):