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:
parent
b09f554175
commit
037ce4318b
|
@ -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
|
||||||
|
|
|
@ -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():
|
||||||
|
|
Loading…
Reference in New Issue