From 096a9ecc5cc1e94f3a36c6f3fae967d6d5f1c749 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Sat, 3 Jan 2009 04:43:58 +0000 Subject: [PATCH] Fixed #9942 -- Added a to_python handler for FloatField to ensure correct typing of deserialized data before saving. Underlying problem is analogous to #8298, fixed in [8515]. Thanks to David Larlet for the report and fix. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9695 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 1 + django/db/models/fields/__init__.py | 9 +++++++++ .../regressiontests/fixtures_regress/fixtures/animal.xml | 1 + .../fixtures_regress/fixtures/sequence.json | 3 ++- tests/regressiontests/fixtures_regress/models.py | 9 ++++++--- 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/AUTHORS b/AUTHORS index c18ec356b99..8e08d769e87 100644 --- a/AUTHORS +++ b/AUTHORS @@ -239,6 +239,7 @@ answer newbie questions, and generally made Django that much better: Nick Lane Stuart Langridge Paul Lanier + David Larlet Nicola Larosa Finn Gruwier Larsen Lau Bech Lauritzen diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index afa1c132382..7acb84bcc7f 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -658,6 +658,15 @@ class FloatField(Field): def get_internal_type(self): return "FloatField" + def to_python(self, value): + if value is None: + return value + try: + return float(value) + except (TypeError, ValueError): + raise exceptions.ValidationError( + _("This value must be a float.")) + def formfield(self, **kwargs): defaults = {'form_class': forms.FloatField} defaults.update(kwargs) diff --git a/tests/regressiontests/fixtures_regress/fixtures/animal.xml b/tests/regressiontests/fixtures_regress/fixtures/animal.xml index 1a993b523dc..0383c60fc12 100644 --- a/tests/regressiontests/fixtures_regress/fixtures/animal.xml +++ b/tests/regressiontests/fixtures_regress/fixtures/animal.xml @@ -4,5 +4,6 @@ Emu Dromaius novaehollandiae 42 + 1.2 \ No newline at end of file diff --git a/tests/regressiontests/fixtures_regress/fixtures/sequence.json b/tests/regressiontests/fixtures_regress/fixtures/sequence.json index 122ebf20732..60bfcdd5471 100644 --- a/tests/regressiontests/fixtures_regress/fixtures/sequence.json +++ b/tests/regressiontests/fixtures_regress/fixtures/sequence.json @@ -5,7 +5,8 @@ "fields": { "name": "Lion", "latin_name": "Panthera leo", - "count": 3 + "count": 3, + "weight": 1.2 } } ] \ No newline at end of file diff --git a/tests/regressiontests/fixtures_regress/models.py b/tests/regressiontests/fixtures_regress/models.py index 373980bb663..621c80c15fd 100644 --- a/tests/regressiontests/fixtures_regress/models.py +++ b/tests/regressiontests/fixtures_regress/models.py @@ -7,6 +7,7 @@ class Animal(models.Model): name = models.CharField(max_length=150) latin_name = models.CharField(max_length=150) count = models.IntegerField() + weight = models.FloatField() def __unicode__(self): return self.common_name @@ -14,6 +15,7 @@ class Animal(models.Model): def animal_pre_save_check(signal, sender, instance, **kwargs): "A signal that is used to check the type of data loaded from fixtures" print 'Count = %s (%s)' % (instance.count, type(instance.count)) + print 'Weight = %s (%s)' % (instance.weight, type(instance.weight)) class Plant(models.Model): name = models.CharField(max_length=150) @@ -69,7 +71,7 @@ __test__ = {'API_TESTS':""" # Create a new animal. Without a sequence reset, this new object # will take a PK of 1 (on Postgres), and the save will fail. # This is a regression test for ticket #3790. ->>> animal = Animal(name='Platypus', latin_name='Ornithorhynchus anatinus', count=2) +>>> animal = Animal(name='Platypus', latin_name='Ornithorhynchus anatinus', count=2, weight=2.3) >>> animal.save() ############################################### @@ -149,12 +151,13 @@ No fixture data found for 'bad_fixture2'. (File format may be invalid.) [1, 2, 3, 4, 5, 6, 7, 8] ############################################### -# Test for ticket #8298 - Field values should be coerced into the correct type -# by the deserializer, not as part of the database write. +# Test for tickets #8298, #9942 - Field values should be coerced into the +# correct type by the deserializer, not as part of the database write. >>> models.signals.pre_save.connect(animal_pre_save_check) >>> management.call_command('loaddata', 'animal.xml', verbosity=0) Count = 42 () +Weight = 1.2 () >>> models.signals.pre_save.disconnect(animal_pre_save_check)