diff options
Diffstat (limited to 'django/db/backends/postgresql_psycopg2')
| -rw-r--r-- | django/db/backends/postgresql_psycopg2/base.py | 10 | ||||
| -rw-r--r-- | django/db/backends/postgresql_psycopg2/features.py | 1 | ||||
| -rw-r--r-- | django/db/backends/postgresql_psycopg2/operations.py | 28 |
3 files changed, 32 insertions, 7 deletions
diff --git a/django/db/backends/postgresql_psycopg2/base.py b/django/db/backends/postgresql_psycopg2/base.py index 34b2870773..37433c3987 100644 --- a/django/db/backends/postgresql_psycopg2/base.py +++ b/django/db/backends/postgresql_psycopg2/base.py @@ -38,6 +38,16 @@ psycopg2.extensions.register_adapter(SafeBytes, psycopg2.extensions.QuotedString psycopg2.extensions.register_adapter(SafeText, psycopg2.extensions.QuotedString) psycopg2.extras.register_uuid() +# Register support for inet[] manually so we don't have to handle the Inet() +# object on load all the time. +INETARRAY_OID = 1041 +INETARRAY = psycopg2.extensions.new_array_type( + (INETARRAY_OID,), + 'INETARRAY', + psycopg2.extensions.UNICODE, +) +psycopg2.extensions.register_type(INETARRAY) + class DatabaseWrapper(BaseDatabaseWrapper): vendor = 'postgresql' diff --git a/django/db/backends/postgresql_psycopg2/features.py b/django/db/backends/postgresql_psycopg2/features.py index 64acd0570a..6bb6de1a96 100644 --- a/django/db/backends/postgresql_psycopg2/features.py +++ b/django/db/backends/postgresql_psycopg2/features.py @@ -6,6 +6,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): needs_datetime_string_cast = False can_return_id_from_insert = True has_real_datatype = True + has_native_uuid_field = True has_native_duration_field = True driver_supports_timedelta_args = True can_defer_constraint_checks = True diff --git a/django/db/backends/postgresql_psycopg2/operations.py b/django/db/backends/postgresql_psycopg2/operations.py index 8e90a4020b..27b19db459 100644 --- a/django/db/backends/postgresql_psycopg2/operations.py +++ b/django/db/backends/postgresql_psycopg2/operations.py @@ -3,6 +3,8 @@ from __future__ import unicode_literals from django.conf import settings from django.db.backends.base.operations import BaseDatabaseOperations +from psycopg2.extras import Inet + class DatabaseOperations(BaseDatabaseOperations): def unification_cast_sql(self, output_field): @@ -57,13 +59,16 @@ class DatabaseOperations(BaseDatabaseOperations): def deferrable_sql(self): return " DEFERRABLE INITIALLY DEFERRED" - def lookup_cast(self, lookup_type): + def lookup_cast(self, lookup_type, internal_type=None): lookup = '%s' # Cast text lookups to text to allow things like filter(x__contains=4) if lookup_type in ('iexact', 'contains', 'icontains', 'startswith', 'istartswith', 'endswith', 'iendswith', 'regex', 'iregex'): - lookup = "%s::text" + if internal_type in ('IPAddressField', 'GenericIPAddressField'): + lookup = "HOST(%s)" + else: + lookup = "%s::text" # Use UPPER(x) for case-insensitive lookups; it's faster. if lookup_type in ('iexact', 'icontains', 'istartswith', 'iendswith'): @@ -71,11 +76,6 @@ class DatabaseOperations(BaseDatabaseOperations): return lookup - def field_cast_sql(self, db_type, internal_type): - if internal_type == "GenericIPAddressField" or internal_type == "IPAddressField": - return 'HOST(%s)' - return '%s' - def last_insert_id(self, cursor, table_name, pk_name): # Use pg_get_serial_sequence to get the underlying sequence name # from the table name and column name (available since PostgreSQL 8) @@ -224,3 +224,17 @@ class DatabaseOperations(BaseDatabaseOperations): def bulk_insert_sql(self, fields, num_values): items_sql = "(%s)" % ", ".join(["%s"] * len(fields)) return "VALUES " + ", ".join([items_sql] * num_values) + + def value_to_db_date(self, value): + return value + + def value_to_db_datetime(self, value): + return value + + def value_to_db_time(self, value): + return value + + def value_to_db_ipaddress(self, value): + if value: + return Inet(value) + return None |
