mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #1142 -- Added multiple database support.
This monster of a patch is the result of Alex Gaynor's 2009 Google Summer of Code project. Congratulations to Alex for a job well done. Big thanks also go to: * Justin Bronn for keeping GIS in line with the changes, * Karen Tracey and Jani Tiainen for their help testing Oracle support * Brett Hoerner, Jon Loyens, and Craig Kimmerer for their feedback. * Malcolm Treddinick for his guidance during the GSoC submission process. * Simon Willison for driving the original design process * Cal Henderson for complaining about ponies he wanted. ... and everyone else too numerous to mention that helped to bring this feature into fruition. git-svn-id: http://code.djangoproject.com/svn/django/trunk@11952 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
@@ -36,14 +36,14 @@ except ImportError:
|
||||
_serializers = {}
|
||||
|
||||
def register_serializer(format, serializer_module, serializers=None):
|
||||
""""Register a new serializer.
|
||||
|
||||
""""Register a new serializer.
|
||||
|
||||
``serializer_module`` should be the fully qualified module name
|
||||
for the serializer.
|
||||
|
||||
|
||||
If ``serializers`` is provided, the registration will be added
|
||||
to the provided dictionary.
|
||||
|
||||
|
||||
If ``serializers`` is not provided, the registration will be made
|
||||
directly into the global register of serializers. Adding serializers
|
||||
directly is not a thread-safe operation.
|
||||
@@ -53,7 +53,7 @@ def register_serializer(format, serializer_module, serializers=None):
|
||||
_serializers[format] = module
|
||||
else:
|
||||
serializers[format] = module
|
||||
|
||||
|
||||
def unregister_serializer(format):
|
||||
"Unregister a given serializer. This is not a thread-safe operation."
|
||||
del _serializers[format]
|
||||
@@ -87,7 +87,7 @@ def serialize(format, queryset, **options):
|
||||
s.serialize(queryset, **options)
|
||||
return s.getvalue()
|
||||
|
||||
def deserialize(format, stream_or_string):
|
||||
def deserialize(format, stream_or_string, **options):
|
||||
"""
|
||||
Deserialize a stream or a string. Returns an iterator that yields ``(obj,
|
||||
m2m_relation_dict)``, where ``obj`` is a instantiated -- but *unsaved* --
|
||||
@@ -95,7 +95,7 @@ def deserialize(format, stream_or_string):
|
||||
list_of_related_objects}``.
|
||||
"""
|
||||
d = get_deserializer(format)
|
||||
return d(stream_or_string)
|
||||
return d(stream_or_string, **options)
|
||||
|
||||
def _load_serializers():
|
||||
"""
|
||||
|
||||
@@ -153,15 +153,16 @@ class DeserializedObject(object):
|
||||
self.m2m_data = m2m_data
|
||||
|
||||
def __repr__(self):
|
||||
return "<DeserializedObject: %s>" % smart_str(self.object)
|
||||
return "<DeserializedObject: %s.%s(pk=%s)>" % (
|
||||
self.object._meta.app_label, self.object._meta.object_name, self.object.pk)
|
||||
|
||||
def save(self, save_m2m=True):
|
||||
def save(self, save_m2m=True, using=None):
|
||||
# Call save on the Model baseclass directly. This bypasses any
|
||||
# model-defined save. The save is also forced to be raw.
|
||||
# This ensures that the data that is deserialized is literally
|
||||
# what came from the file, not post-processed by pre_save/save
|
||||
# methods.
|
||||
models.Model.save_base(self.object, raw=True)
|
||||
models.Model.save_base(self.object, using=using, raw=True)
|
||||
if self.m2m_data and save_m2m:
|
||||
for accessor_name, object_list in self.m2m_data.items():
|
||||
setattr(self.object, accessor_name, object_list)
|
||||
|
||||
@@ -39,7 +39,7 @@ def Deserializer(stream_or_string, **options):
|
||||
stream = StringIO(stream_or_string)
|
||||
else:
|
||||
stream = stream_or_string
|
||||
for obj in PythonDeserializer(simplejson.load(stream)):
|
||||
for obj in PythonDeserializer(simplejson.load(stream), **options):
|
||||
yield obj
|
||||
|
||||
class DjangoJSONEncoder(simplejson.JSONEncoder):
|
||||
|
||||
@@ -6,7 +6,7 @@ other serializers.
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.serializers import base
|
||||
from django.db import models
|
||||
from django.db import models, DEFAULT_DB_ALIAS
|
||||
from django.utils.encoding import smart_unicode, is_protected_type
|
||||
|
||||
class Serializer(base.Serializer):
|
||||
@@ -77,6 +77,7 @@ def Deserializer(object_list, **options):
|
||||
It's expected that you pass the Python objects themselves (instead of a
|
||||
stream or a string) to the constructor
|
||||
"""
|
||||
db = options.pop('using', DEFAULT_DB_ALIAS)
|
||||
models.get_apps()
|
||||
for d in object_list:
|
||||
# Look up the model and starting build a dict of data for it.
|
||||
@@ -96,7 +97,7 @@ def Deserializer(object_list, **options):
|
||||
if hasattr(field.rel.to._default_manager, 'get_by_natural_key'):
|
||||
def m2m_convert(value):
|
||||
if hasattr(value, '__iter__'):
|
||||
return field.rel.to._default_manager.get_by_natural_key(*value).pk
|
||||
return field.rel.to._default_manager.db_manager(db).get_by_natural_key(*value).pk
|
||||
else:
|
||||
return smart_unicode(field.rel.to._meta.pk.to_python(value))
|
||||
else:
|
||||
@@ -108,7 +109,7 @@ def Deserializer(object_list, **options):
|
||||
if field_value is not None:
|
||||
if hasattr(field.rel.to._default_manager, 'get_by_natural_key'):
|
||||
if hasattr(field_value, '__iter__'):
|
||||
obj = field.rel.to._default_manager.get_by_natural_key(*field_value)
|
||||
obj = field.rel.to._default_manager.db_manager(db).get_by_natural_key(*field_value)
|
||||
value = getattr(obj, field.rel.field_name)
|
||||
else:
|
||||
value = field.rel.to._meta.get_field(field.rel.field_name).to_python(field_value)
|
||||
|
||||
@@ -5,13 +5,9 @@ Requires PyYaml (http://pyyaml.org/), but that's checked for in __init__.
|
||||
"""
|
||||
|
||||
from StringIO import StringIO
|
||||
import decimal
|
||||
import yaml
|
||||
|
||||
try:
|
||||
import decimal
|
||||
except ImportError:
|
||||
from django.utils import _decimal as decimal # Python 2.3 fallback
|
||||
|
||||
from django.db import models
|
||||
from django.core.serializers.python import Serializer as PythonSerializer
|
||||
from django.core.serializers.python import Deserializer as PythonDeserializer
|
||||
@@ -58,6 +54,6 @@ def Deserializer(stream_or_string, **options):
|
||||
stream = StringIO(stream_or_string)
|
||||
else:
|
||||
stream = stream_or_string
|
||||
for obj in PythonDeserializer(yaml.load(stream)):
|
||||
for obj in PythonDeserializer(yaml.load(stream), **options):
|
||||
yield obj
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ XML serializer.
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.serializers import base
|
||||
from django.db import models
|
||||
from django.db import models, DEFAULT_DB_ALIAS
|
||||
from django.utils.xmlutils import SimplerXMLGenerator
|
||||
from django.utils.encoding import smart_unicode
|
||||
from xml.dom import pulldom
|
||||
@@ -149,6 +149,7 @@ class Deserializer(base.Deserializer):
|
||||
def __init__(self, stream_or_string, **options):
|
||||
super(Deserializer, self).__init__(stream_or_string, **options)
|
||||
self.event_stream = pulldom.parse(self.stream)
|
||||
self.db = options.pop('using', DEFAULT_DB_ALIAS)
|
||||
|
||||
def next(self):
|
||||
for event, node in self.event_stream:
|
||||
@@ -218,7 +219,7 @@ class Deserializer(base.Deserializer):
|
||||
if keys:
|
||||
# If there are 'natural' subelements, it must be a natural key
|
||||
field_value = [getInnerText(k).strip() for k in keys]
|
||||
obj = field.rel.to._default_manager.get_by_natural_key(*field_value)
|
||||
obj = field.rel.to._default_manager.db_manager(self.db).get_by_natural_key(*field_value)
|
||||
obj_pk = getattr(obj, field.rel.field_name)
|
||||
else:
|
||||
# Otherwise, treat like a normal PK
|
||||
@@ -239,7 +240,7 @@ class Deserializer(base.Deserializer):
|
||||
if keys:
|
||||
# If there are 'natural' subelements, it must be a natural key
|
||||
field_value = [getInnerText(k).strip() for k in keys]
|
||||
obj_pk = field.rel.to._default_manager.get_by_natural_key(*field_value).pk
|
||||
obj_pk = field.rel.to._default_manager.db_manager(self.db).get_by_natural_key(*field_value).pk
|
||||
else:
|
||||
# Otherwise, treat like a normal PK value.
|
||||
obj_pk = field.rel.to._meta.pk.to_python(n.getAttribute('pk'))
|
||||
|
||||
Reference in New Issue
Block a user