Fixed #7190 -- Corrected a problem with Boolean value handling on the MySQL backend. Thanks to George Vilches for the initial patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12900 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2010-04-01 15:10:53 +00:00
parent 2fa2cf0a09
commit 271bcda04a
4 changed files with 62 additions and 2 deletions

View File

@ -125,6 +125,8 @@ class DatabaseFeatures(BaseDatabaseFeatures):
related_fields_match_type = True related_fields_match_type = True
class DatabaseOperations(BaseDatabaseOperations): class DatabaseOperations(BaseDatabaseOperations):
compiler_module = "django.db.backends.mysql.compiler"
def date_extract_sql(self, lookup_type, field_name): def date_extract_sql(self, lookup_type, field_name):
# http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html # http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
if lookup_type == 'week_day': if lookup_type == 'week_day':

View File

@ -0,0 +1,27 @@
from django.db.models.sql import compiler
class SQLCompiler(compiler.SQLCompiler):
def resolve_columns(self, row, fields=()):
values = []
for value, field in map(None, row, fields):
if (field and field.get_internal_type() in ("BooleanField", "NullBooleanField") and
value in (0, 1)):
value = bool(value)
values.append(value)
return tuple(values)
class SQLInsertCompiler(compiler.SQLInsertCompiler, SQLCompiler):
pass
class SQLDeleteCompiler(compiler.SQLDeleteCompiler, SQLCompiler):
pass
class SQLUpdateCompiler(compiler.SQLUpdateCompiler, SQLCompiler):
pass
class SQLAggregateCompiler(compiler.SQLAggregateCompiler, SQLCompiler):
pass
class SQLDateCompiler(compiler.SQLDateCompiler, SQLCompiler):
pass

View File

@ -67,6 +67,8 @@ class Post(models.Model):
class NullBooleanModel(models.Model): class NullBooleanModel(models.Model):
nbfield = models.NullBooleanField() nbfield = models.NullBooleanField()
class BooleanModel(models.Model):
bfield = models.BooleanField()
############################################################################### ###############################################################################
# ImageField # ImageField

View File

@ -6,7 +6,7 @@ from django import forms
from django.db import models from django.db import models
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from models import Foo, Bar, Whiz, BigD, BigS, Image, BigInt, Post, NullBooleanModel from models import Foo, Bar, Whiz, BigD, BigS, Image, BigInt, Post, NullBooleanModel, BooleanModel
try: try:
from decimal import Decimal from decimal import Decimal
@ -162,6 +162,35 @@ class BooleanFieldTests(unittest.TestCase):
f = models.BooleanField(choices=choices, default=1, null=False) f = models.BooleanField(choices=choices, default=1, null=False)
self.assertEqual(f.formfield().choices, choices) self.assertEqual(f.formfield().choices, choices)
def test_return_type(self):
b = BooleanModel()
b.bfield = True
b.save()
b2 = BooleanModel.objects.get(pk=b.pk)
self.assertTrue(isinstance(b2.bfield, bool))
self.assertEqual(b2.bfield, True)
b3 = BooleanModel()
b3.bfield = False
b3.save()
b4 = BooleanModel.objects.get(pk=b3.pk)
self.assertTrue(isinstance(b4.bfield, bool))
self.assertEqual(b4.bfield, False)
b = NullBooleanModel()
b.nbfield = True
b.save()
b2 = NullBooleanModel.objects.get(pk=b.pk)
self.assertTrue(isinstance(b2.nbfield, bool))
self.assertEqual(b2.nbfield, True)
b3 = NullBooleanModel()
b3.nbfield = False
b3.save()
b4 = NullBooleanModel.objects.get(pk=b3.pk)
self.assertTrue(isinstance(b4.nbfield, bool))
self.assertEqual(b4.nbfield, False)
class ChoicesTests(django.test.TestCase): class ChoicesTests(django.test.TestCase):
def test_choices_and_field_display(self): def test_choices_and_field_display(self):
""" """