Fixed #10839 -- `GeoQuery` now unpickles properly on Oracle.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10615 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Justin Bronn 2009-04-21 22:35:04 +00:00
parent b09f554175
commit 037ce4318b
2 changed files with 25 additions and 0 deletions

View File

@ -33,6 +33,13 @@ class GeoQuery(sql.Query):
self.transformed_srid = None self.transformed_srid = None
self.extra_select_fields = {} self.extra_select_fields = {}
if SpatialBackend.oracle:
# Have to override this so that GeoQuery, instead of OracleQuery,
# is returned when unpickling.
def __reduce__(self):
callable, args, data = super(GeoQuery, self).__reduce__()
return (unpickle_geoquery, (), data)
def clone(self, *args, **kwargs): def clone(self, *args, **kwargs):
obj = super(GeoQuery, self).clone(*args, **kwargs) obj = super(GeoQuery, self).clone(*args, **kwargs)
# Customized selection dictionary and transformed srid flag have # Customized selection dictionary and transformed srid flag have
@ -332,3 +339,12 @@ class GeoQuery(sql.Query):
# Otherwise, check by the given field name -- which may be # Otherwise, check by the given field name -- which may be
# a lookup to a _related_ geographic field. # a lookup to a _related_ geographic field.
return GeoWhereNode._check_geo_field(self.model._meta, field_name) return GeoWhereNode._check_geo_field(self.model._meta, field_name)
if SpatialBackend.oracle:
def unpickle_geoquery():
"""
Utility function, called by Python's unpickling machinery, that handles
unpickling of GeoQuery subclasses of OracleQuery.
"""
return GeoQuery.__new__(GeoQuery)
unpickle_geoquery.__safe_for_unpickling__ = True

View File

@ -222,6 +222,15 @@ class RelatedGeoModelTest(unittest.TestCase):
self.failUnless('Aurora' in names) self.failUnless('Aurora' in names)
self.failUnless('Kecksburg' in names) self.failUnless('Kecksburg' in names)
def test11_geoquery_pickle(self):
"Ensuring GeoQuery objects are unpickled correctly. See #10839."
import pickle
from django.contrib.gis.db.models.sql import GeoQuery
qs = City.objects.all()
q_str = pickle.dumps(qs.query)
q = pickle.loads(q_str)
self.assertEqual(GeoQuery, q.__class__)
# TODO: Related tests for KML, GML, and distance lookups. # TODO: Related tests for KML, GML, and distance lookups.
def suite(): def suite():