Ticket #7190: django-real-bools.4.diff

File django-real-bools.4.diff, 5.9 KB (added by Alex, 6 years ago)
  • django/db/models/fields/__init__.py

    diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
    index 05f16db..02c69c2 100644
    a b class BooleanField(Field): 
    524524        return "BooleanField"
    525525
    526526    def to_python(self, value):
    527         if value in (True, False): return value
    528         if value in ('t', 'True', '1'): return True
    529         if value in ('f', 'False', '0'): return False
     527        if value in (True, False):
     528            # if value is 1 or 0 than it's equal to True or False, but we want
     529            # to return a true bool for semantic reasons.
     530            return bool(value)
     531        if value in ('t', 'True', '1'):
     532            return True
     533        if value in ('f', 'False', '0'):
     534            return False
    530535        raise exceptions.ValidationError(self.error_messages['invalid'])
    531536
    532537    def get_prep_lookup(self, lookup_type, value):
    class NullBooleanField(Field): 
    934939        return "NullBooleanField"
    935940
    936941    def to_python(self, value):
    937         if value in (None, True, False): return value
    938         if value in ('None',): return None
    939         if value in ('t', 'True', '1'): return True
    940         if value in ('f', 'False', '0'): return False
     942        if value is None:
     943            return None
     944        if value in (True, False):
     945            return bool(value)
     946        if value in ('None',):
     947            return None
     948        if value in ('t', 'True', '1'):
     949            return True
     950        if value in ('f', 'False', '0'):
     951            return False
    941952        raise exceptions.ValidationError(self.error_messages['invalid'])
    942953
    943954    def get_prep_lookup(self, lookup_type, value):
  • docs/ref/databases.txt

    diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt
    index afead83..3a7c3ea 100644
    a b Notes on specific fields 
    326326Boolean fields
    327327~~~~~~~~~~~~~~
    328328
    329 Since MySQL doesn't have a direct ``BOOLEAN`` column type, Django uses a
    330 ``TINYINT`` column with values of ``1`` and ``0`` to store values for the
    331 :class:`~django.db.models.BooleanField` model field. Refer to the documentation
    332 of that field for more details, but usually this won't be something that will
    333 matter unless you're printing out the field values and are expecting to see
    334 ``True`` and ``False.``.
     329.. versionchanged:: 1.2
     330
     331In previous versions of Django when running under MySQL ``BooleanFields`` would
     332return their data as ``ints``, instead of true ``bools``.  See the release
     333notes for a complete description of the change.
    335334
    336335Character fields
    337336~~~~~~~~~~~~~~~~
  • docs/ref/models/fields.txt

    diff --git a/docs/ref/models/fields.txt b/docs/ref/models/fields.txt
    index cd66c46..e824cf7 100644
    a b A true/false field. 
    342342
    343343The admin represents this as a checkbox.
    344344
    345 .. admonition:: MySQL users..
    346 
    347     A boolean field in MySQL is stored as a ``TINYINT`` column with a value of
    348     either 0 or 1 (most databases have a proper ``BOOLEAN`` type instead). So,
    349     for MySQL, only, when a ``BooleanField`` is retrieved from the database
    350     and stored on a model attribute, it will have the values 1 or 0, rather
    351     than ``True`` or ``False``. Normally, this shouldn't be a problem, since
    352     Python guarantees that ``1 == True`` and ``0 == False`` are both true.
    353     Just be careful if you're writing something like ``obj is True`` when
    354     ``obj`` is a value from a boolean attribute on a model. If that model was
    355     constructed using the ``mysql`` backend, the "``is``" test will fail.
    356     Prefer an equality test (using "``==``") in cases like this.
     345.. versionchanged:: 1.2
     346   
     347    In previous versions of Django when running under MySQL ``BooleanFields``
     348    would return their data as ``ints``, instead of true ``bools``.  See the
     349    release notes for a complete description of the change.
    357350
    358351``CharField``
    359352-------------
  • docs/releases/1.2.txt

    diff --git a/docs/releases/1.2.txt b/docs/releases/1.2.txt
    index b952ec1..703ded3 100644
    a b created using ``decorator_from_middleware``. 
    302302
    303303.. _deprecated-features-1.2:
    304304
     305``BooleanField`` on MySQL
     306--------------------------
     307
     308In previous versions of Django ``BoleanFields`` under MySQL would return their
     309values as either ``1`` or ``0``, instead of ``True`` or ``False``.  For most
     310people this shouldn't have been a problem because ``bool`` is a subclass of
     311``int``, however in Django 1.2 MySQL correctly returns a real ``bool``.  The
     312only time this should ever be an issue is if you were expecting printing the
     313``repr`` of a ``BooleanField`` to print ``1`` or ``0``.
     314
    305315Features deprecated in 1.2
    306316==========================
    307317
  • tests/regressiontests/model_fields/tests.py

    diff --git a/tests/regressiontests/model_fields/tests.py b/tests/regressiontests/model_fields/tests.py
    index 18bfbd3..1ee92d4 100644
    a b class BooleanFieldTests(unittest.TestCase): 
    107107        self.assertEqual(f.get_db_prep_lookup('exact', '0', connection=connection), [False])
    108108        self.assertEqual(f.get_db_prep_lookup('exact', 0, connection=connection), [False])
    109109        self.assertEqual(f.get_db_prep_lookup('exact', None, connection=connection), [None])
     110   
     111    def _test_to_python(self, f):
     112        self.assertTrue(f.to_python(1) is True)
     113        self.assertTrue(f.to_python(0) is False)
    110114
    111115    def test_booleanfield_get_db_prep_lookup(self):
    112116        self._test_get_db_prep_lookup(models.BooleanField())
    113117
    114118    def test_nullbooleanfield_get_db_prep_lookup(self):
    115119        self._test_get_db_prep_lookup(models.NullBooleanField())
     120   
     121    def test_booleanfield_to_python(self):
     122        self._test_to_python(models.BooleanField())
     123   
     124    def test_nullbooleanfield_to_python(self):
     125        self._test_to_python(models.NullBooleanField())
    116126
    117127    def test_booleanfield_choices_blank(self):
    118128        """
Back to Top