mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Refs #24928 -- Added introspection support for PostgreSQL JSONField
Thanks Adam Johnson and Tim Graham for the reviews.
This commit is contained in:
		| @@ -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) | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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` | ||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
|   | ||||
							
								
								
									
										26
									
								
								tests/postgres_tests/test_introspection.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								tests/postgres_tests/test_introspection.py
									
									
									
									
									
										Normal 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)'], | ||||
|         ) | ||||
		Reference in New Issue
	
	Block a user