summaryrefslogtreecommitdiff
path: root/django/core/serializers/python.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/core/serializers/python.py')
-rw-r--r--django/core/serializers/python.py21
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)