Add the ability to lazily import and construct registries.
Review Request #10511 — Created April 4, 2019 and submitted — Latest diff uploaded
Registry instances are commonly constructed in the
__init__.py
of a
module, but this can interfere with the Django initialization process if
the registry's module or population logic requires direct or indirect
access to modules containing models or some other Django apps.The solution to this is to lazily construct the registries on access.
This can be done throughSimpleLazyObject
, which will construct an
instance on first access and then forward on all operations to it. To
simplify usage of this, this change introduces a
lazy_import_registry()
method, which will set up a function to import
and construct of the registry and return aSimpleLazyObject
with that
function.This should be usable in any place where a registry needs to be
constructed. It can also help speed up startup times when working with
more expensive registries.
Made use of this in Review Board. All unit tests pass there on all
supported versions of Django.