mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #24607 -- Serialized natural keys in multi-table inheritance models.
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user