diff options
| author | Caio Ariede <caio.ariede@gmail.com> | 2019-10-16 09:32:12 -0300 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-11-19 09:34:11 +0100 |
| commit | 555bebe7749ab1a72d5141a00f9ce7a602c72298 (patch) | |
| tree | 54b6414c047c65dd5d4c22e388168d9c9edfb84a /django/db | |
| parent | aa12cf07c9202e117712abe2621d901dd6dd94b4 (diff) | |
Fixed #30987 -- Added models.PositiveBigIntegerField.
Diffstat (limited to 'django/db')
| -rw-r--r-- | django/db/backends/base/operations.py | 1 | ||||
| -rw-r--r-- | django/db/backends/mysql/base.py | 2 | ||||
| -rw-r--r-- | django/db/backends/mysql/introspection.py | 4 | ||||
| -rw-r--r-- | django/db/backends/mysql/operations.py | 2 | ||||
| -rw-r--r-- | django/db/backends/oracle/base.py | 2 | ||||
| -rw-r--r-- | django/db/backends/oracle/operations.py | 1 | ||||
| -rw-r--r-- | django/db/backends/oracle/utils.py | 2 | ||||
| -rw-r--r-- | django/db/backends/postgresql/base.py | 2 | ||||
| -rw-r--r-- | django/db/backends/sqlite3/base.py | 2 | ||||
| -rw-r--r-- | django/db/backends/sqlite3/introspection.py | 1 | ||||
| -rw-r--r-- | django/db/models/fields/__init__.py | 19 |
11 files changed, 34 insertions, 4 deletions
diff --git a/django/db/backends/base/operations.py b/django/db/backends/base/operations.py index a6abe3769b..d9d59b4109 100644 --- a/django/db/backends/base/operations.py +++ b/django/db/backends/base/operations.py @@ -24,6 +24,7 @@ class BaseDatabaseOperations: 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), + 'PositiveBigIntegerField': (0, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), 'SmallAutoField': (-32768, 32767), diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index 74c98a091c..aeb935e91f 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -120,6 +120,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): 'GenericIPAddressField': 'char(39)', 'NullBooleanField': 'bool', 'OneToOneField': 'integer', + 'PositiveBigIntegerField': 'bigint UNSIGNED', 'PositiveIntegerField': 'integer UNSIGNED', 'PositiveSmallIntegerField': 'smallint UNSIGNED', 'SlugField': 'varchar(%(max_length)s)', @@ -339,6 +340,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): def data_type_check_constraints(self): if self.features.supports_column_check_constraints: return { + 'PositiveBigIntegerField': '`%(column)s` >= 0', 'PositiveIntegerField': '`%(column)s` >= 0', 'PositiveSmallIntegerField': '`%(column)s` >= 0', } diff --git a/django/db/backends/mysql/introspection.py b/django/db/backends/mysql/introspection.py index a014b87916..9334cc5748 100644 --- a/django/db/backends/mysql/introspection.py +++ b/django/db/backends/mysql/introspection.py @@ -47,7 +47,9 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): elif field_type == 'SmallIntegerField': return 'SmallAutoField' if description.is_unsigned: - if field_type == 'IntegerField': + if field_type == 'BigIntegerField': + return 'PositiveBigIntegerField' + elif field_type == 'IntegerField': return 'PositiveIntegerField' elif field_type == 'SmallIntegerField': return 'PositiveSmallIntegerField' diff --git a/django/db/backends/mysql/operations.py b/django/db/backends/mysql/operations.py index b801afef4a..5069939689 100644 --- a/django/db/backends/mysql/operations.py +++ b/django/db/backends/mysql/operations.py @@ -15,6 +15,7 @@ class DatabaseOperations(BaseDatabaseOperations): **BaseDatabaseOperations.integer_field_ranges, 'PositiveSmallIntegerField': (0, 65535), 'PositiveIntegerField': (0, 4294967295), + 'PositiveBigIntegerField': (0, 18446744073709551615), } cast_data_types = { 'AutoField': 'signed integer', @@ -26,6 +27,7 @@ class DatabaseOperations(BaseDatabaseOperations): 'IntegerField': 'signed integer', 'BigIntegerField': 'signed integer', 'SmallIntegerField': 'signed integer', + 'PositiveBigIntegerField': 'unsigned integer', 'PositiveIntegerField': 'unsigned integer', 'PositiveSmallIntegerField': 'unsigned integer', } diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index ef33d9fad7..e1c76ec058 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -120,6 +120,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): 'GenericIPAddressField': 'VARCHAR2(39)', 'NullBooleanField': 'NUMBER(1)', 'OneToOneField': 'NUMBER(11)', + 'PositiveBigIntegerField': 'NUMBER(19)', 'PositiveIntegerField': 'NUMBER(11)', 'PositiveSmallIntegerField': 'NUMBER(11)', 'SlugField': 'NVARCHAR2(%(max_length)s)', @@ -133,6 +134,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): data_type_check_constraints = { 'BooleanField': '%(qn_column)s IN (0,1)', 'NullBooleanField': '%(qn_column)s IN (0,1)', + 'PositiveBigIntegerField': '%(qn_column)s >= 0', 'PositiveIntegerField': '%(qn_column)s >= 0', 'PositiveSmallIntegerField': '%(qn_column)s >= 0', } diff --git a/django/db/backends/oracle/operations.py b/django/db/backends/oracle/operations.py index 3d093792b8..c44f2a9cee 100644 --- a/django/db/backends/oracle/operations.py +++ b/django/db/backends/oracle/operations.py @@ -25,6 +25,7 @@ class DatabaseOperations(BaseDatabaseOperations): 'SmallIntegerField': (-99999999999, 99999999999), 'IntegerField': (-99999999999, 99999999999), 'BigIntegerField': (-9999999999999999999, 9999999999999999999), + 'PositiveBigIntegerField': (0, 9999999999999999999), 'PositiveSmallIntegerField': (0, 99999999999), 'PositiveIntegerField': (0, 99999999999), 'SmallAutoField': (-99999, 99999), diff --git a/django/db/backends/oracle/utils.py b/django/db/backends/oracle/utils.py index 2bfebb0d55..a3d03fa1f9 100644 --- a/django/db/backends/oracle/utils.py +++ b/django/db/backends/oracle/utils.py @@ -16,6 +16,7 @@ class InsertVar: 'IntegerField': int, 'BigIntegerField': int, 'SmallIntegerField': int, + 'PositiveBigIntegerField': int, 'PositiveSmallIntegerField': int, 'PositiveIntegerField': int, 'FloatField': Database.NATIVE_FLOAT, @@ -71,6 +72,7 @@ class BulkInsertMapper: 'FloatField': NUMBER, 'IntegerField': NUMBER, 'NullBooleanField': NUMBER, + 'PositiveBigIntegerField': NUMBER, 'PositiveIntegerField': NUMBER, 'PositiveSmallIntegerField': NUMBER, 'SmallIntegerField': NUMBER, diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index eea8aeb135..bf15a13018 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -89,6 +89,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): 'GenericIPAddressField': 'inet', 'NullBooleanField': 'boolean', 'OneToOneField': 'integer', + 'PositiveBigIntegerField': 'bigint', 'PositiveIntegerField': 'integer', 'PositiveSmallIntegerField': 'smallint', 'SlugField': 'varchar(%(max_length)s)', @@ -99,6 +100,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): 'UUIDField': 'uuid', } data_type_check_constraints = { + 'PositiveBigIntegerField': '"%(column)s" >= 0', 'PositiveIntegerField': '"%(column)s" >= 0', 'PositiveSmallIntegerField': '"%(column)s" >= 0', } diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index 51a15ee10a..a3ae1f048e 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -102,6 +102,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): 'GenericIPAddressField': 'char(39)', 'NullBooleanField': 'bool', 'OneToOneField': 'integer', + 'PositiveBigIntegerField': 'bigint unsigned', 'PositiveIntegerField': 'integer unsigned', 'PositiveSmallIntegerField': 'smallint unsigned', 'SlugField': 'varchar(%(max_length)s)', @@ -112,6 +113,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): 'UUIDField': 'char(32)', } data_type_check_constraints = { + 'PositiveBigIntegerField': '"%(column)s" >= 0', 'PositiveIntegerField': '"%(column)s" >= 0', 'PositiveSmallIntegerField': '"%(column)s" >= 0', } diff --git a/django/db/backends/sqlite3/introspection.py b/django/db/backends/sqlite3/introspection.py index 5186e6d14b..2b5e732a47 100644 --- a/django/db/backends/sqlite3/introspection.py +++ b/django/db/backends/sqlite3/introspection.py @@ -37,6 +37,7 @@ class FlexibleFieldLookupDict: 'integer': 'IntegerField', 'bigint': 'BigIntegerField', 'integer unsigned': 'PositiveIntegerField', + 'bigint unsigned': 'PositiveBigIntegerField', 'decimal': 'DecimalField', 'real': 'FloatField', 'text': 'TextField', diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 83f98f74f8..aa21a151bc 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -33,9 +33,9 @@ __all__ = [ 'DateField', 'DateTimeField', 'DecimalField', 'DurationField', 'EmailField', 'Empty', 'Field', 'FilePathField', 'FloatField', 'GenericIPAddressField', 'IPAddressField', 'IntegerField', 'NOT_PROVIDED', - 'NullBooleanField', 'PositiveIntegerField', 'PositiveSmallIntegerField', - 'SlugField', 'SmallAutoField', 'SmallIntegerField', 'TextField', - 'TimeField', 'URLField', 'UUIDField', + 'NullBooleanField', 'PositiveBigIntegerField', 'PositiveIntegerField', + 'PositiveSmallIntegerField', 'SlugField', 'SmallAutoField', + 'SmallIntegerField', 'TextField', 'TimeField', 'URLField', 'UUIDField', ] @@ -1955,6 +1955,19 @@ class PositiveIntegerRelDbTypeMixin: return IntegerField().db_type(connection=connection) +class PositiveBigIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField): + description = _('Positive big integer') + + def get_internal_type(self): + return 'PositiveBigIntegerField' + + def formfield(self, **kwargs): + return super().formfield(**{ + 'min_value': 0, + **kwargs, + }) + + class PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField): description = _("Positive integer") |
