Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

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

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10615 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 037ce4318b1ea1b99a946d3a70ae2796731ecb1a 1 parent b09f554
@jbronn jbronn authored
View
16 django/contrib/gis/db/models/sql/query.py
@@ -33,6 +33,13 @@ def __init__(self, model, conn):
self.transformed_srid = None
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):
obj = super(GeoQuery, self).clone(*args, **kwargs)
# Customized selection dictionary and transformed srid flag have
@@ -332,3 +339,12 @@ def _geo_field(self, field_name=None):
# Otherwise, check by the given field name -- which may be
# a lookup to a _related_ geographic field.
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
9 django/contrib/gis/tests/relatedapp/tests.py
@@ -222,6 +222,15 @@ def test10_combine(self):
self.failUnless('Aurora' 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.
def suite():
Please sign in to comment.
Something went wrong with that request. Please try again.