diff options
| author | dmytryi.striletskyi <dmytryi.striletskyi@gmail.com> | 2018-11-22 22:11:51 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-11-27 18:35:19 -0500 |
| commit | dcd1025f4c03faa4a9915a1d47d07008280dd3cf (patch) | |
| tree | cfc3b97da1c2fa54cc893c075a1d28ef6bc1a16d /django | |
| parent | 926fa7116fd633b69277c3ad9b3370ca45163231 (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.py | 15 |
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): |
