diff options
| author | Mohamed Karam <muhakh@pop-os.localdomain> | 2022-08-26 15:06:52 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-08-27 15:51:08 +0200 |
| commit | b92ffebb0cdc469baaf1b8f0e72dddb069eb2fb4 (patch) | |
| tree | 43ddc1aae7de4892f35ca39c95d3a9e3abcc20f3 /django | |
| parent | 806e9e2d0dcf8f58e376fb7e2a8b9771e2a9ce16 (diff) | |
Fixed #33954 -- Prevented models.DecimalField from accepting NaN, Inf, and -Inf values.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/fields/__init__.py | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 5381a3b17f..fd6969cd3d 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -2,7 +2,6 @@ import collections.abc import copy import datetime import decimal -import math import operator import uuid import warnings @@ -1703,22 +1702,24 @@ class DecimalField(Field): def to_python(self, value): if value is None: return value - if isinstance(value, float): - if math.isnan(value): - raise exceptions.ValidationError( - self.error_messages["invalid"], - code="invalid", - params={"value": value}, - ) - return self.context.create_decimal_from_float(value) try: - return decimal.Decimal(value) + if isinstance(value, float): + decimal_value = self.context.create_decimal_from_float(value) + else: + decimal_value = decimal.Decimal(value) except (decimal.InvalidOperation, TypeError, ValueError): raise exceptions.ValidationError( self.error_messages["invalid"], code="invalid", params={"value": value}, ) + if not decimal_value.is_finite(): + raise exceptions.ValidationError( + self.error_messages["invalid"], + code="invalid", + params={"value": value}, + ) + return decimal_value def get_db_prep_save(self, value, connection): return connection.ops.adapt_decimalfield_value( |
