diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py index 3868b41e0d..c3ad179c7a 100644 --- a/django/db/backends/__init__.py +++ b/django/db/backends/__init__.py @@ -571,6 +571,9 @@ class BaseDatabaseFeatures(object): # Can the backend determine reliably the length of a CharField? can_introspect_max_length = True + # Can the backend determine reliably if a field is nullable? + can_introspect_null = True + # Confirm support for introspected foreign keys # Every database can do this reliably, except MySQL, # which can't do it for MyISAM tables diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index de264a7b5b..f7790415db 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -112,6 +112,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): supports_tablespaces = True supports_sequence_reset = False can_introspect_max_length = False + can_introspect_null = False can_introspect_time_field = False atomic_transactions = False supports_combined_alters = False diff --git a/tests/introspection/tests.py b/tests/introspection/tests.py index fee6e59544..432658c21f 100644 --- a/tests/introspection/tests.py +++ b/tests/introspection/tests.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals from django.db import connection -from django.test import TestCase, skipUnlessDBFeature, skipIfDBFeature +from django.test import TestCase, skipUnlessDBFeature from .models import Reporter, Article @@ -73,10 +73,9 @@ class IntrospectionTests(TestCase): [30, 30, 75] ) - # Oracle forces null=True under the hood in some cases (see - # https://docs.djangoproject.com/en/dev/ref/databases/#null-and-empty-strings) - # so its idea about null_ok in cursor.description is different from ours. - @skipIfDBFeature('interprets_empty_strings_as_nulls') + # The following test fails on Oracle. Since it forces null=True under the + # hood in some cases, its idea about null_ok is different from ours. + @skipUnlessDBFeature('can_introspect_null') def test_get_table_description_nullable(self): with connection.cursor() as cursor: desc = connection.introspection.get_table_description(cursor, Reporter._meta.db_table)