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:
parent
8931d8d688
commit
e9814029f5
@ -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,
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user