summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2017-09-09 14:39:09 +0200
committerClaude Paroz <claude@2xlibre.net>2017-09-09 18:26:29 +0200
commit0cbb6ac00770d201b8f30a404d516b97fe41485d (patch)
tree59d7c55f7808e1ba186f53fdf8008a5b7797dab2
parentffbee67f8e17e1cfffcaa0116c170141a7363dda (diff)
Refs #24928 -- Added introspection support for PostgreSQL JSONField
Thanks Adam Johnson and Tim Graham for the reviews.
-rw-r--r--django/contrib/postgres/apps.py8
-rw-r--r--docs/ref/django-admin.txt4
-rw-r--r--docs/releases/2.0.txt3
-rw-r--r--tests/postgres_tests/test_introspection.py26
4 files changed, 38 insertions, 3 deletions
diff --git a/django/contrib/postgres/apps.py b/django/contrib/postgres/apps.py
index f298814f7d..2ad6aaefc8 100644
--- a/django/contrib/postgres/apps.py
+++ b/django/contrib/postgres/apps.py
@@ -15,8 +15,12 @@ class PostgresConfig(AppConfig):
def ready(self):
# Connections may already exist before we are called.
for conn in connections.all():
- if conn.connection is not None:
- register_type_handlers(conn)
+ if conn.vendor == 'postgresql':
+ conn.introspection.data_types_reverse.update({
+ 3802: 'django.contrib.postgresql.fields.JSONField',
+ })
+ if conn.connection is not None:
+ register_type_handlers(conn)
connection_created.connect(register_type_handlers)
CharField.register_lookup(Unaccent)
TextField.register_lookup(Unaccent)
diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt
index 3a83bd2b7d..7c8ac29473 100644
--- a/docs/ref/django-admin.txt
+++ b/docs/ref/django-admin.txt
@@ -366,7 +366,9 @@ output:
* If ``inspectdb`` cannot map a column's type to a model field type, it'll
use ``TextField`` and will insert the Python comment
``'This field type is a guess.'`` next to the field in the generated
- model.
+ model. The recognized fields may depend on apps listed in
+ :setting:`INSTALLED_APPS`. For example, :mod:`django.contrib.postgres` adds
+ recognition for several PostgreSQL-specific field types.
* If the database column name is a Python reserved word (such as
``'pass'``, ``'class'`` or ``'for'``), ``inspectdb`` will append
diff --git a/docs/releases/2.0.txt b/docs/releases/2.0.txt
index 7b2df87fcf..46ff112dba 100644
--- a/docs/releases/2.0.txt
+++ b/docs/releases/2.0.txt
@@ -123,6 +123,9 @@ Minor features
operation installs the ``btree_gist`` extension to add support for operator
classes that aren't built-in.
+* :djadmin:`inspectdb` can now introspect ``JSONField``
+ (``django.contrib.postgres`` must be in ``INSTALLED_APPS``).
+
:mod:`django.contrib.redirects`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/tests/postgres_tests/test_introspection.py b/tests/postgres_tests/test_introspection.py
new file mode 100644
index 0000000000..1058a1656b
--- /dev/null
+++ b/tests/postgres_tests/test_introspection.py
@@ -0,0 +1,26 @@
+from io import StringIO
+
+from django.core.management import call_command
+from django.test.utils import modify_settings
+
+from . import PostgreSQLTestCase
+
+
+@modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'})
+class InspectDBTests(PostgreSQLTestCase):
+ def assertFieldsInModel(self, model, field_outputs):
+ out = StringIO()
+ call_command(
+ 'inspectdb',
+ table_name_filter=lambda tn: tn.startswith(model),
+ stdout=out,
+ )
+ output = out.getvalue()
+ for field_output in field_outputs:
+ self.assertIn(field_output, output)
+
+ def test_json_field(self):
+ self.assertFieldsInModel(
+ 'postgres_tests_jsonmodel',
+ ['field = django.contrib.postgresql.fields.JSONField(blank=True, null=True)'],
+ )