Returns a Django model referenced by an app setting where the value is
        expected to be a valid 'model string' in the format:
        "app_label.model_name".

        :param setting_name:
            The name of the app setting for which a value is required.
        :type setting_name: str (e.g. "SETTING_NAME")
        :param warn_only_if_overridden:
            If the setting named by ``setting_name`` is deprecated, a value of
            ``True`` can be provided to silence the immediate deprecation
            warning that is otherwise raised by default. Instead, a
            (differently worded) deprecation warning will be raised, but only
            when the setting is overriden.
        :type warn_only_if_overridden: bool
        :param accept_deprecated:
            If the setting named by ``setting_name`` replaces multiple
            deprecated settings, the ``accept_deprecated`` keyword argument can
            be used to specify which of those deprecated settings to accept as
            an override value.

            Where the requested setting replaces only a single deprecated
            setting, override values for that deprecated setting will be
            accepted automatically, without having to specify anything.
        :type accept_deprecated: str (e.g. "DEPRECATED_SETTING_NAME")
        :param suppress_warnings:
            Use this to prevent the raising of any deprecation warnings that
            might otherwise be raised. It may be more useful to use
            ``warn_only_if_overridden`` instead.
        :type suppress_warnings: bool
        :param warning_stacklevel:
            When raising deprecation warnings related to the request, this
            value is passed on as ``stacklevel`` to Python's
            ``warnings.warn()`` method, to help give a more accurate indication
            of the code that caused the warning to be raised.
        :type warning_stacklevel: int
        :raises:
            UnknownSettingNameError, SettingValueTypeInvalid,
            SettingValueFormatInvalid, SettingValueNotImportable

        Instead of calling this method directly, developers are generally
        encouraged to use the ``models`` attribute shortcut, which is a
        syntactically much cleaner way to request values using the default
        options. For example, the the following lines are equivalent::

            appsettingshelper.models.SETTING_NAME
            appsettingshelper.get_model('SETTING_NAME')

def get_model(self, setting_name, warn_only_if_overridden=False,
                  accept_deprecated='', suppress_warnings=False,
                  warning_stacklevel=3):
        """
        Returns a Django model referenced by an app setting where the value is
        expected to be a valid 'model string' in the format:
        "app_label.model_name".

        :param setting_name:
            The name of the app setting for which a value is required.
        :type setting_name: str (e.g. "SETTING_NAME")
        :param warn_only_if_overridden:
            If the setting named by ``setting_name`` is deprecated, a value of
            ``True`` can be provided to silence the immediate deprecation
            warning that is otherwise raised by default. Instead, a
            (differently worded) deprecation warning will be raised, but only
            when the setting is overriden.
        :type warn_only_if_overridden: bool
        :param accept_deprecated:
            If the setting named by ``setting_name`` replaces multiple
            deprecated settings, the ``accept_deprecated`` keyword argument can
            be used to specify which of those deprecated settings to accept as
            an override value.

            Where the requested setting replaces only a single deprecated
            setting, override values for that deprecated setting will be
            accepted automatically, without having to specify anything.
        :type accept_deprecated: str (e.g. "DEPRECATED_SETTING_NAME")
        :param suppress_warnings:
            Use this to prevent the raising of any deprecation warnings that
            might otherwise be raised. It may be more useful to use
            ``warn_only_if_overridden`` instead.
        :type suppress_warnings: bool
        :param warning_stacklevel:
            When raising deprecation warnings related to the request, this
            value is passed on as ``stacklevel`` to Python's
            ``warnings.warn()`` method, to help give a more accurate indication
            of the code that caused the warning to be raised.
        :type warning_stacklevel: int
        :raises:
            UnknownSettingNameError, SettingValueTypeInvalid,
            SettingValueFormatInvalid, SettingValueNotImportable

        Instead of calling this method directly, developers are generally
        encouraged to use the ``models`` attribute shortcut, which is a
        syntactically much cleaner way to request values using the default
        options. For example, the the following lines are equivalent::

            appsettingshelper.models.SETTING_NAME
            appsettingshelper.get_model('SETTING_NAME')

        """
        self._warn_if_deprecated_setting_value_requested(
            setting_name, warn_only_if_overridden, suppress_warnings,
            warning_stacklevel)

        cache_key = self._make_cache_key(setting_name, accept_deprecated)
        if cache_key in self._models_cache:
            return self._models_cache[cache_key]

        raw_value = self.get(
            setting_name,
            enforce_type=str,
            accept_deprecated=accept_deprecated,
            check_if_setting_deprecated=False,
            warn_only_if_overridden=warn_only_if_overridden,
            suppress_warnings=suppress_warnings,
            warning_stacklevel=warning_stacklevel + 1,
        )

        try:
            from django.apps import apps  # delay import until needed
            result = apps.get_model(raw_value)
            self._models_cache[cache_key] = result
            return result
        except ValueError:
            self._raise_setting_value_error(
                setting_name=setting_name,
                user_value_error_class=OverrideValueFormatInvalid,
                default_value_error_class=DefaultValueFormatInvalid,
                additional_text=(
                    "Model strings should match the format 'app_label.Model', "
                    "which '{value}' does not adhere to."
                ),
                value=raw_value,
            )
        except LookupError:
            self._raise_setting_value_error(
                setting_name=setting_name,
                user_value_error_class=OverrideValueNotImportable,
                default_value_error_class=DefaultValueNotImportable,
                additional_text=(
                    "The model '{value}' does not appear to be installed."
                ),
                value=raw_value
            )