summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
Diffstat (limited to 'django')
-rw-r--r--django/core/serializers/base.py8
-rw-r--r--django/db/models/options.py7
2 files changed, 13 insertions, 2 deletions
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index a6c8847278..cc3d94e155 100644
--- a/django/core/serializers/base.py
+++ b/django/core/serializers/base.py
@@ -88,7 +88,7 @@ class Serializer(object):
if self.selected_fields is None or field.attname in self.selected_fields:
self.handle_field(obj, field)
else:
- if self.selected_fields is None or field.attname[:-3] in self.selected_fields:
+ if self.field_is_selected(field) and self.output_pk_field(obj, field):
self.handle_fk_field(obj, field)
for field in concrete_model._meta.many_to_many:
if field.serialize:
@@ -101,6 +101,12 @@ class Serializer(object):
self.end_serialization()
return self.getvalue()
+ def field_is_selected(self, field):
+ return self.selected_fields is None or field.attname[:-3] in self.selected_fields
+
+ def output_pk_field(self, obj, pk_field):
+ return self.use_natural_primary_keys or pk_field != obj._meta.pk
+
def start_serialization(self):
"""
Called when serializing of the queryset starts.
diff --git a/django/db/models/options.py b/django/db/models/options.py
index 0cf1726315..04696a4e9e 100644
--- a/django/db/models/options.py
+++ b/django/db/models/options.py
@@ -13,6 +13,7 @@ from django.db import connections
from django.db.models import Manager
from django.db.models.fields import AutoField
from django.db.models.fields.proxy import OrderWrt
+from django.db.models.fields.related import OneToOneField
from django.utils import six
from django.utils.datastructures import ImmutableList, OrderedSet
from django.utils.deprecation import (
@@ -296,7 +297,11 @@ class Options(object):
def setup_pk(self, field):
if not self.pk and field.primary_key:
self.pk = field
- field.serialize = False
+ # If the field is a OneToOneField and it's been marked as PK, then
+ # this is a multi-table inheritance PK. It needs to be serialized
+ # to relate the subclass instance to the superclass instance.
+ if not isinstance(field, OneToOneField):
+ field.serialize = False
def setup_proxy(self, target):
"""