Refs #24928 -- Added introspection support for PostgreSQL JSONField
Thanks Adam Johnson and Tim Graham for the reviews.
This commit is contained in:
parent
ffbee67f8e
commit
0cbb6ac007
|
@ -15,8 +15,12 @@ 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.connection is not None:
|
if conn.vendor == 'postgresql':
|
||||||
register_type_handlers(conn)
|
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)
|
connection_created.connect(register_type_handlers)
|
||||||
CharField.register_lookup(Unaccent)
|
CharField.register_lookup(Unaccent)
|
||||||
TextField.register_lookup(Unaccent)
|
TextField.register_lookup(Unaccent)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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`
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -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)'],
|
||||||
|
)
|
Loading…
Reference in New Issue