Opened 12 years ago
Closed 12 years ago
#19565 closed Bug (invalid)
FloatField object returns string when it's value is set from string
Reported by: | Owned by: | nobody | |
---|---|---|---|
Component: | Uncategorized | Version: | 1.4 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
When float field is set from string value representing float, it is correctly saved (string is converted to float). But the field itself returns string in this case (even after save). This is pretty awful, because there is no error when the field is saved... and then suddenly you get a string value from field that you expect to return float. If you get access to the same row via different row, it - correctly - returns float instead.
Expected behaviour - the field should consistently return float.
Some code presenting it. I am als attaching .zipped full django project with only this model and test.
model:
class TestModel(models.Model):
test_field = FloatField(null=True)
test:
class TestFloatFieldAsString(TestCase):
def test_float_field_as_string(self):
model1 = TestModel(test_field=12.4)
model1.save()
print model1.test_field + 1.0
model2 = TestModel(test_field='12.4')
model2.save()
try:
print model2.test_field + 1.0
self.fail("Expect failure here")
except TypeError as exc:
print "expected:" + str(exc)
model3 = TestModel.objects.get(id = model2.id)
print model3.test_field + 1.0
Attachments (1)
Change History (5)
by , 12 years ago
Attachment: | float_error.zip added |
---|
comment:1 by , 12 years ago
The above test prints:
13.4
expected:cannot concatenate 'str' and 'float' objects
13.5
comment:2 by , 12 years ago
Also interesting effect is having 13.5 returned where we expect 13.4 .. but this one is likely caused by float precision arithmetics
comment:3 by , 12 years ago
If I call clean_fields() then m.test_field returns a float value, however if I call m.save() then m.test_field returns a string. It means clean_fields() method is not called while saving.
In [14]: m = TestModel(test_field='12.4') In [15]: m.clean_fields() In [16]: m.test_field Out[16]: 12.4 In [17]: m = TestModel(test_field='12.4') In [18]: m.save() In [19]: m.test_field Out[19]: '12.4'
comment:4 by , 12 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
This is much like #12401, only for a different type of field. When a model object is created, the field value isn't converted from string (or whatever is passed in the constructor) to "correct" type for the field. As noted in https://code.djangoproject.com/ticket/12401#comment:10, this is a long-standing design decision and cannot be changed at this point without significant backward incompatibility.
full django project with test that shows the problem