diff options
Diffstat (limited to 'django/core/serializers/python.py')
| -rw-r--r-- | django/core/serializers/python.py | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py index 2929874b01..53a73e19e5 100644 --- a/django/core/serializers/python.py +++ b/django/core/serializers/python.py @@ -34,7 +34,7 @@ class Serializer(base.Serializer): def get_dump_object(self, obj): data = {"model": str(obj._meta)} - if not self.use_natural_primary_keys or not hasattr(obj, "natural_key"): + if not self.use_natural_primary_keys or not self._resolve_natural_key(obj): data["pk"] = self._value_from_field(obj, obj._meta.pk) data["fields"] = self._current return data @@ -52,26 +52,25 @@ class Serializer(base.Serializer): self._current[field.name] = self._value_from_field(obj, field) def handle_fk_field(self, obj, field): - if self.use_natural_foreign_keys and hasattr( - field.remote_field.model, "natural_key" + if self.use_natural_foreign_keys and ( + natural_key_value := self._resolve_fk_natural_key(obj, field) ): - related = getattr(obj, field.name) - if related: - value = related.natural_key() - else: - value = None + value = natural_key_value else: value = self._value_from_field(obj, field) self._current[field.name] = value def handle_m2m_field(self, obj, field): if field.remote_field.through._meta.auto_created: - if self.use_natural_foreign_keys and hasattr( - field.remote_field.model, "natural_key" + if self.use_natural_foreign_keys and self._model_supports_natural_key( + field.remote_field.model ): def m2m_value(value): - return value.natural_key() + if natural := value.natural_key(): + return natural + else: + return self._value_from_field(value, value._meta.pk) def queryset_iterator(obj, field): attr = getattr(obj, field.name) |
