﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
36441	Add lazy loading support for GDAL library in `django.contrib.gis.gdal`	Josh Thomas	Josh Thomas	"I'd like to propose enabling lazy loading of the GDAL library in `django.contrib.gis.gdal`, matching the existing behavior of `django.contrib.gis.geos` with the GEOS library.

Currently, calling `django.setup()` on projects using GeoDjango fails if GDAL is not installed, even when GDAL functionality is not being used. This creates an inconsistency in the GeoDjango framework where the GEOS library supports lazy loading (implemented in 2015 in 61d09e61f5747d7a70268ca8d5e770486877500b) but GDAL does not. The proposed change would implement lazy loading for the GDAL module similar to the existing GEOS implementation, ensuring the GDAL library is only loaded when actually accessed or used. 

I have a working proof-of-concept in a [https://github.com/joshuadavidthomas/django/tree/lazy-gdal branch] on my fork of the Django repo ready for review ([https://github.com/django/django/compare/main...joshuadavidthomas:django:lazy-gdal diff]). 

The implementation follows the same approach as the original GEOS lazy loading commit, wrapping the library loading in `SimpleLazyObject` and converting function prototypes to use lazy loading. The public API remains unchanged (everything imported in `django/contrib/gis/gdal/__init__.py` continues to work as before), though the imports related to the GDAL version from `django.contrib.gis.gdal.libgdal` now use lazy evaluation. The existing test suite passes without modification, and I've added new tests specifically for the lazy loading behavior. Documentation updates have not been included yet as I wasn't sure if that was needed for a change like this.

I have created both a [https://forum.djangoproject.com/t/proposal-lazy-loading-for-django-contrib-gis-gdal/41198 forum post] and an [https://github.com/django/new-features/issues/42 issue on django/new-features]. Both have only been open for a few days, so not a ton of time for people to see them. However, the initial reception has been positive, with the forum post receiving several likes and the new-features issue getting only thumbs-up reactions.

History: GDAL was initially (inadvertently) required before it was made optional in #5433 and then was made required in #26753 in order to simply the code base."	Cleanup/optimization	assigned	GIS	dev	Normal		gdal		Accepted	1	0	0	1	0	0
