Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #15169 -- Corrected handling of model boolean fields in MySQL s…

…patial backend.

Thanks goes to zmsmith and others for reporting the issue and to Justin Bronn for the fix.

Refs #7190, r12578, r12900, #13293, r12939.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17588 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 9f6859e1eac0c39e2e4fb79a1336eb63b0295fec 1 parent 5a013ce
@ramiro ramiro authored
View
2  django/contrib/gis/db/backends/mysql/operations.py
@@ -5,7 +5,7 @@
class MySQLOperations(DatabaseOperations, BaseSpatialOperations):
- compiler_module = 'django.contrib.gis.db.models.sql.compiler'
+ compiler_module = 'django.contrib.gis.db.backends.mysql.compiler'
mysql = True
name = 'mysql'
select = 'AsText(%s)'
View
7 django/contrib/gis/db/models/sql/compiler.py
@@ -185,9 +185,10 @@ def resolve_columns(self, row, fields=()):
self.query.extra_select_fields.get(a, None),
self.connection)
for v, a in izip(row[rn_offset:index_start], aliases)]
- if self.connection.ops.oracle or getattr(self.query, 'geo_values', False):
- # We resolve the rest of the columns if we're on Oracle or if
- # the `geo_values` attribute is defined.
+
+ if self.connection.ops.oracle or self.connection.ops.mysql or getattr(self.query, 'geo_values', False):
+ # We resolve the rest of the columns if we're on MySQL, Oracle or
+ # if the `geo_values` attribute is defined.
for value, field in map(None, row[index_start:], fields):
values.append(self.query.convert_values(value, field, self.connection))
else:
View
4 django/contrib/gis/db/models/sql/query.py
@@ -56,8 +56,8 @@ def convert_values(self, value, field, connection):
extra selection objects into Geometry and Distance objects.
TODO: Make converted objects 'lazy' for less overhead.
"""
- if connection.ops.oracle:
- # Running through Oracle's first.
+ if connection.ops.oracle or connection.ops.mysql:
+ # On MySQL and Oracle, call their version of `convert_values` first.
value = super(GeoQuery, self).convert_values(value, field or GeomField(), connection)
if value is None:
View
4 django/contrib/gis/tests/geoapp/models.py
@@ -34,6 +34,10 @@ class Track(models.Model):
objects = models.GeoManager()
def __unicode__(self): return self.name
+class Truth(models.Model):
+ val = models.BooleanField()
+ objects = models.GeoManager()
+
if not spatialite:
class Feature(models.Model):
name = models.CharField(max_length=20)
View
10 django/contrib/gis/tests/geoapp/test_regress.py
@@ -7,7 +7,7 @@
from django.db.models import Count
from django.test import TestCase
-from .models import City, PennsylvaniaCity, State
+from .models import City, PennsylvaniaCity, State, Truth
class GeoRegressionTests(TestCase):
@@ -64,3 +64,11 @@ def test06_defer_or_only_with_annotate(self):
"Regression for #16409 - make sure defer() and only() work with annotate()"
self.assertIsInstance(list(City.objects.annotate(Count('point')).defer('name')), list)
self.assertIsInstance(list(City.objects.annotate(Count('point')).only('name')), list)
+
+ def test04_boolean_conversion(self):
+ "Testing Boolean value conversion with the spatial backend, see #15169."
+ t1 = Truth.objects.create(val=True)
+ t2 = Truth.objects.create(val=False)
+
+ self.assertTrue(Truth.objects.get(pk=1).val is True)
+ self.assertTrue(Truth.objects.get(pk=2).val is False)
View
6 django/db/backends/mysql/base.py
@@ -176,6 +176,12 @@ def _can_introspect_foreign_keys(self):
class DatabaseOperations(BaseDatabaseOperations):
compiler_module = "django.db.backends.mysql.compiler"
+ def convert_values(self, value, field):
+ if (field and field.get_internal_type() in ("BooleanField", "NullBooleanField") and
+ value in (0, 1)):
+ value = bool(value)
+ return value
+
def date_extract_sql(self, lookup_type, field_name):
# http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
if lookup_type == 'week_day':
View
5 django/db/backends/mysql/compiler.py
@@ -5,10 +5,7 @@ def resolve_columns(self, row, fields=()):
values = []
index_extra_select = len(self.query.extra_select.keys())
for value, field in map(None, row[index_extra_select:], fields):
- if (field and field.get_internal_type() in ("BooleanField", "NullBooleanField") and
- value in (0, 1)):
- value = bool(value)
- values.append(value)
+ values.append(self.query.convert_values(value, field, connection=self.connection))
return row[:index_extra_select] + tuple(values)
class SQLInsertCompiler(compiler.SQLInsertCompiler, SQLCompiler):
Please sign in to comment.
Something went wrong with that request. Please try again.