summaryrefslogtreecommitdiff
path: root/django/db
diff options
context:
space:
mode:
authorCaio Ariede <caio.ariede@gmail.com>2019-10-16 09:32:12 -0300
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-11-19 09:34:11 +0100
commit555bebe7749ab1a72d5141a00f9ce7a602c72298 (patch)
tree54b6414c047c65dd5d4c22e388168d9c9edfb84a /django/db
parentaa12cf07c9202e117712abe2621d901dd6dd94b4 (diff)
Fixed #30987 -- Added models.PositiveBigIntegerField.
Diffstat (limited to 'django/db')
-rw-r--r--django/db/backends/base/operations.py1
-rw-r--r--django/db/backends/mysql/base.py2
-rw-r--r--django/db/backends/mysql/introspection.py4
-rw-r--r--django/db/backends/mysql/operations.py2
-rw-r--r--django/db/backends/oracle/base.py2
-rw-r--r--django/db/backends/oracle/operations.py1
-rw-r--r--django/db/backends/oracle/utils.py2
-rw-r--r--django/db/backends/postgresql/base.py2
-rw-r--r--django/db/backends/sqlite3/base.py2
-rw-r--r--django/db/backends/sqlite3/introspection.py1
-rw-r--r--django/db/models/fields/__init__.py19
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")