mirror of
https://github.com/django/django.git
synced 2025-06-04 02:59:13 +00:00
Fixed #17602 -- Stopped the XML serializer from doing unneeded queries. Thanks, gnosek.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17439 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
928f605efe
commit
62efdcb037
@ -45,18 +45,12 @@ class Serializer(base.Serializer):
|
|||||||
self._current[field.name] = field.value_to_string(obj)
|
self._current[field.name] = field.value_to_string(obj)
|
||||||
|
|
||||||
def handle_fk_field(self, obj, field):
|
def handle_fk_field(self, obj, field):
|
||||||
related = getattr(obj, field.name)
|
if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
|
||||||
if related is not None:
|
related = getattr(obj, field.name)
|
||||||
if self.use_natural_keys and hasattr(related, 'natural_key'):
|
value = related.natural_key()
|
||||||
related = related.natural_key()
|
else:
|
||||||
else:
|
value = getattr(obj, field.get_attname())
|
||||||
if field.rel.field_name == related._meta.pk.name:
|
self._current[field.name] = value
|
||||||
# Related to remote object via primary key
|
|
||||||
related = related._get_pk_val()
|
|
||||||
else:
|
|
||||||
# Related to remote object via other field
|
|
||||||
related = smart_unicode(getattr(related, field.rel.field_name), strings_only=True)
|
|
||||||
self._current[field.name] = related
|
|
||||||
|
|
||||||
def handle_m2m_field(self, obj, field):
|
def handle_m2m_field(self, obj, field):
|
||||||
if field.rel.through._meta.auto_created:
|
if field.rel.through._meta.auto_created:
|
||||||
|
@ -85,9 +85,10 @@ class Serializer(base.Serializer):
|
|||||||
differently from regular fields).
|
differently from regular fields).
|
||||||
"""
|
"""
|
||||||
self._start_relational_field(field)
|
self._start_relational_field(field)
|
||||||
related = getattr(obj, field.name)
|
related_att = getattr(obj, field.get_attname())
|
||||||
if related is not None:
|
if related_att is not None:
|
||||||
if self.use_natural_keys and hasattr(related, 'natural_key'):
|
if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
|
||||||
|
related = getattr(obj, field.name)
|
||||||
# If related object has a natural key, use it
|
# If related object has a natural key, use it
|
||||||
related = related.natural_key()
|
related = related.natural_key()
|
||||||
# Iterable natural keys are rolled out as subelements
|
# Iterable natural keys are rolled out as subelements
|
||||||
@ -96,13 +97,7 @@ class Serializer(base.Serializer):
|
|||||||
self.xml.characters(smart_unicode(key_value))
|
self.xml.characters(smart_unicode(key_value))
|
||||||
self.xml.endElement("natural")
|
self.xml.endElement("natural")
|
||||||
else:
|
else:
|
||||||
if field.rel.field_name == related._meta.pk.name:
|
self.xml.characters(smart_unicode(related_att))
|
||||||
# Related to remote object via primary key
|
|
||||||
related = related._get_pk_val()
|
|
||||||
else:
|
|
||||||
# Related to remote object via other field
|
|
||||||
related = getattr(related, field.rel.field_name)
|
|
||||||
self.xml.characters(smart_unicode(related))
|
|
||||||
else:
|
else:
|
||||||
self.xml.addQuickElement("None")
|
self.xml.addQuickElement("None")
|
||||||
self.xml.endElement("field")
|
self.xml.endElement("field")
|
||||||
|
@ -178,6 +178,19 @@ class SerializersTestBase(object):
|
|||||||
mv_obj = obj_list[0].object
|
mv_obj = obj_list[0].object
|
||||||
self.assertEqual(mv_obj.title, movie_title)
|
self.assertEqual(mv_obj.title, movie_title)
|
||||||
|
|
||||||
|
def test_serialize_superfluous_queries(self):
|
||||||
|
"""Ensure no superfluous queries are made when serializing ForeignKeys
|
||||||
|
|
||||||
|
#17602
|
||||||
|
"""
|
||||||
|
ac = Actor(name='Actor name')
|
||||||
|
ac.save()
|
||||||
|
mv = Movie(title='Movie title', actor_id=ac.pk)
|
||||||
|
mv.save()
|
||||||
|
|
||||||
|
with self.assertNumQueries(0):
|
||||||
|
serial_str = serializers.serialize(self.serializer_name, [mv])
|
||||||
|
|
||||||
def test_serialize_with_null_pk(self):
|
def test_serialize_with_null_pk(self):
|
||||||
"""
|
"""
|
||||||
Tests that serialized data with no primary key results
|
Tests that serialized data with no primary key results
|
||||||
|
Loading…
x
Reference in New Issue
Block a user