1
0
mirror of https://github.com/django/django.git synced 2024-12-22 17:16:24 +00:00

Fixed #10692 -- Fixed DecimalField lookups for extreme values.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10545 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2009-04-12 05:32:23 +00:00
parent 8931d8d688
commit e9814029f5
2 changed files with 25 additions and 10 deletions

View File

@ -620,10 +620,13 @@ class DecimalField(Field):
from django.db.backends import util from django.db.backends import util
return util.format_number(value, self.max_digits, self.decimal_places) return util.format_number(value, self.max_digits, self.decimal_places)
def get_db_prep_value(self, value): def get_db_prep_save(self, value):
return connection.ops.value_to_db_decimal(self.to_python(value), return connection.ops.value_to_db_decimal(self.to_python(value),
self.max_digits, self.decimal_places) self.max_digits, self.decimal_places)
def get_db_prep_value(self, value):
return self.to_python(value)
def formfield(self, **kwargs): def formfield(self, **kwargs):
defaults = { defaults = {
'max_digits': self.max_digits, 'max_digits': self.max_digits,

View File

@ -1,32 +1,35 @@
import datetime import datetime
import unittest import unittest
import django.test import django.test
from django import forms 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 from models import Foo, Bar, Whiz, BigD, BigS
try: try:
from decimal import Decimal from decimal import Decimal
except ImportError: except ImportError:
from django.utils._decimal import Decimal from django.utils._decimal import Decimal
class DecimalFieldTests(django.test.TestCase): class DecimalFieldTests(django.test.TestCase):
def test_to_python(self): def test_to_python(self):
f = models.DecimalField(max_digits=4, decimal_places=2) f = models.DecimalField(max_digits=4, decimal_places=2)
self.assertEqual(f.to_python(3), Decimal("3")) self.assertEqual(f.to_python(3), Decimal("3"))
self.assertEqual(f.to_python("3.14"), Decimal("3.14")) self.assertEqual(f.to_python("3.14"), Decimal("3.14"))
self.assertRaises(ValidationError, f.to_python, "abc") self.assertRaises(ValidationError, f.to_python, "abc")
def test_default(self): def test_default(self):
f = models.DecimalField(default=Decimal("0.00")) f = models.DecimalField(default=Decimal("0.00"))
self.assertEqual(f.get_default(), Decimal("0.00")) self.assertEqual(f.get_default(), Decimal("0.00"))
def test_format(self): def test_format(self):
f = models.DecimalField(max_digits=5, decimal_places=1) f = models.DecimalField(max_digits=5, decimal_places=1)
self.assertEqual(f._format(f.to_python(2)), u'2.0') self.assertEqual(f._format(f.to_python(2)), u'2.0')
self.assertEqual(f._format(f.to_python('2.6')), u'2.6') self.assertEqual(f._format(f.to_python('2.6')), u'2.6')
self.assertEqual(f._format(None), None) self.assertEqual(f._format(None), None)
def test_get_db_prep_lookup(self): def test_get_db_prep_lookup(self):
f = models.DecimalField(max_digits=5, decimal_places=1) f = models.DecimalField(max_digits=5, decimal_places=1)
self.assertEqual(f.get_db_prep_lookup('exact', None), [None]) self.assertEqual(f.get_db_prep_lookup('exact', None), [None])
@ -38,7 +41,7 @@ class DecimalFieldTests(django.test.TestCase):
Foo.objects.create(id=1, a='abc', d=Decimal("12.34")) Foo.objects.create(id=1, a='abc', d=Decimal("12.34"))
self.assertEqual(list(Foo.objects.filter(d=u'1.23')), []) self.assertEqual(list(Foo.objects.filter(d=u'1.23')), [])
def test_save_wihout_float_conversion(self): def test_save_without_float_conversion(self):
""" """
Ensure decimals don't go through a corrupting float conversion during Ensure decimals don't go through a corrupting float conversion during
save (#5079). save (#5079).
@ -48,6 +51,14 @@ class DecimalFieldTests(django.test.TestCase):
bd = BigD.objects.get(pk=bd.pk) bd = BigD.objects.get(pk=bd.pk)
self.assertEqual(bd.d, Decimal("12.9")) self.assertEqual(bd.d, Decimal("12.9"))
def test_lookup_really_big_value(self):
"""
Ensure that really big values can be used in a filter statement, even
with older Python versions.
"""
# This should not crash. That counts as a win for our purposes.
Foo.objects.filter(d__gte=100000000000)
class ForeignKeyTests(django.test.TestCase): class ForeignKeyTests(django.test.TestCase):
def test_callable_default(self): def test_callable_default(self):
"""Test the use of a lazy callable for ForeignKey.default""" """Test the use of a lazy callable for ForeignKey.default"""
@ -63,11 +74,11 @@ class DateTimeFieldTests(unittest.TestCase):
datetime.datetime(2001, 1, 2, 3, 4, 5, 6)) datetime.datetime(2001, 1, 2, 3, 4, 5, 6))
self.assertEqual(f.to_python('2001-01-02 03:04:05.999999'), self.assertEqual(f.to_python('2001-01-02 03:04:05.999999'),
datetime.datetime(2001, 1, 2, 3, 4, 5, 999999)) datetime.datetime(2001, 1, 2, 3, 4, 5, 999999))
def test_timefield_to_python_usecs(self): def test_timefield_to_python_usecs(self):
"""TimeField.to_python should support usecs""" """TimeField.to_python should support usecs"""
f = models.TimeField() f = models.TimeField()
self.assertEqual(f.to_python('01:02:03.000004'), self.assertEqual(f.to_python('01:02:03.000004'),
datetime.time(1, 2, 3, 4)) datetime.time(1, 2, 3, 4))
self.assertEqual(f.to_python('01:02:03.999999'), self.assertEqual(f.to_python('01:02:03.999999'),
datetime.time(1, 2, 3, 999999)) datetime.time(1, 2, 3, 999999))
@ -111,7 +122,7 @@ class ChoicesTests(django.test.TestCase):
self.assertEqual(Whiz(c=9).get_c_display(), 9) # Invalid value self.assertEqual(Whiz(c=9).get_c_display(), 9) # Invalid value
self.assertEqual(Whiz(c=None).get_c_display(), None) # Blank value self.assertEqual(Whiz(c=None).get_c_display(), None) # Blank value
self.assertEqual(Whiz(c='').get_c_display(), '') # Empty value self.assertEqual(Whiz(c='').get_c_display(), '') # Empty value
class SlugFieldTests(django.test.TestCase): class SlugFieldTests(django.test.TestCase):
def test_slugfield_max_length(self): def test_slugfield_max_length(self):
""" """
@ -119,4 +130,5 @@ class SlugFieldTests(django.test.TestCase):
""" """
bs = BigS.objects.create(s = 'slug'*50) bs = BigS.objects.create(s = 'slug'*50)
bs = BigS.objects.get(pk=bs.pk) bs = BigS.objects.get(pk=bs.pk)
self.assertEqual(bs.s, 'slug'*50) self.assertEqual(bs.s, 'slug'*50)