Refs #24928 -- Added introspection support for PostgreSQL JSONField

Thanks Adam Johnson and Tim Graham for the reviews.
This commit is contained in:
Claude Paroz 2017-09-09 14:39:09 +02:00
parent ffbee67f8e
commit 0cbb6ac007
4 changed files with 38 additions and 3 deletions

View File

@ -15,6 +15,10 @@ class PostgresConfig(AppConfig):
def ready(self): def ready(self):
# Connections may already exist before we are called. # Connections may already exist before we are called.
for conn in connections.all(): for conn in connections.all():
if conn.vendor == 'postgresql':
conn.introspection.data_types_reverse.update({
3802: 'django.contrib.postgresql.fields.JSONField',
})
if conn.connection is not None: if conn.connection is not None:
register_type_handlers(conn) register_type_handlers(conn)
connection_created.connect(register_type_handlers) connection_created.connect(register_type_handlers)

View File

@ -366,7 +366,9 @@ output:
* If ``inspectdb`` cannot map a column's type to a model field type, it'll * If ``inspectdb`` cannot map a column's type to a model field type, it'll
use ``TextField`` and will insert the Python comment use ``TextField`` and will insert the Python comment
``'This field type is a guess.'`` next to the field in the generated ``'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 * If the database column name is a Python reserved word (such as
``'pass'``, ``'class'`` or ``'for'``), ``inspectdb`` will append ``'pass'``, ``'class'`` or ``'for'``), ``inspectdb`` will append

View File

@ -123,6 +123,9 @@ Minor features
operation installs the ``btree_gist`` extension to add support for operator operation installs the ``btree_gist`` extension to add support for operator
classes that aren't built-in. classes that aren't built-in.
* :djadmin:`inspectdb` can now introspect ``JSONField``
(``django.contrib.postgres`` must be in ``INSTALLED_APPS``).
:mod:`django.contrib.redirects` :mod:`django.contrib.redirects`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -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)'],
)