Commit 11e43883 authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

Fixed #8298: Added a to_python method for integer fields. This ensures that...

Fixed #8298: Added a to_python method for integer fields. This ensures that the data from deserialized instances is of correct type prior to saving. Thanks to Andrew Badr for the report.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@8515 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent e822fd70
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -786,6 +786,14 @@ class IntegerField(Field):
    def get_internal_type(self):
        return "IntegerField"

    def to_python(self, value):
        if value is None:
            return value
        try:
            return int(value)
        except (TypeError, ValueError):
            raise validators.ValidationError, _("This value must be an integer.")
                
    def formfield(self, **kwargs):
        defaults = {'form_class': forms.IntegerField}
        defaults.update(kwargs)
+8 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<django-objects version="1.0">
  <object pk="10" model="fixtures_regress.animal">
      <field type="CharField" name="name">Emu</field>
      <field type="CharField" name="latin_name">Dromaius novaehollandiae</field>
      <field type="IntegerField" name="count">42</field>
  </object>
</django-objects>
 No newline at end of file
+2 −1
Original line number Diff line number Diff line
@@ -4,7 +4,8 @@
        "model": "fixtures_regress.animal", 
        "fields": {
            "name": "Lion", 
            "latin_name": "Panthera leo"
            "latin_name": "Panthera leo",
            "count": 3
        }
    }
]
 No newline at end of file
+17 −2
Original line number Diff line number Diff line
@@ -6,10 +6,15 @@ import os
class Animal(models.Model):
    name = models.CharField(max_length=150)
    latin_name = models.CharField(max_length=150)
    count = models.IntegerField()
    
    def __unicode__(self):
        return self.common_name

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))

class Plant(models.Model):
    name = models.CharField(max_length=150)

@@ -64,7 +69,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')
>>> animal = Animal(name='Platypus', latin_name='Ornithorhynchus anatinus', count=2)
>>> animal.save()

###############################################
@@ -134,4 +139,14 @@ No fixture data found for 'bad_fixture2'. (File format may be invalid.)
>>> articles.values_list('id', flat=True)
[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.

>>> models.signals.pre_save.connect(animal_pre_save_check)
>>> management.call_command('loaddata', 'animal.xml', verbosity=0)
Count = 42 (<type 'int'>)

>>> models.signals.pre_save.disconnect(animal_pre_save_check)

"""}