Commit 7f51876f authored by Anssi Kääriäinen's avatar Anssi Kääriäinen Committed by Tim Graham
Browse files

Fixed #26207 -- Replaced dynamic classes with non-data descriptors for deferred instance loading.

parent dac075e9
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -165,8 +165,7 @@ class AppConfig(object):
            raise LookupError(
                "App '%s' doesn't have a '%s' model." % (self.label, model_name))

    def get_models(self, include_auto_created=False,
                   include_deferred=False, include_swapped=False):
    def get_models(self, include_auto_created=False, include_swapped=False):
        """
        Returns an iterable of models.

@@ -182,8 +181,6 @@ class AppConfig(object):
        """
        self.check_models_ready()
        for model in self.models.values():
            if model._deferred and not include_deferred:
                continue
            if model._meta.auto_created and not include_auto_created:
                continue
            if model._meta.swapped and not include_swapped:
+2 −4
Original line number Diff line number Diff line
@@ -156,8 +156,7 @@ class Apps(object):

    # This method is performance-critical at least for Django's test suite.
    @lru_cache.lru_cache(maxsize=None)
    def get_models(self, include_auto_created=False,
                   include_deferred=False, include_swapped=False):
    def get_models(self, include_auto_created=False, include_swapped=False):
        """
        Returns a list of all installed models.

@@ -174,8 +173,7 @@ class Apps(object):

        result = []
        for app_config in self.app_configs.values():
            result.extend(list(app_config.get_models(
                include_auto_created, include_deferred, include_swapped)))
            result.extend(list(app_config.get_models(include_auto_created, include_swapped)))
        return result

    def get_model(self, app_label, model_name=None):
+0 −2
Original line number Diff line number Diff line
@@ -27,8 +27,6 @@ class ContentTypeManager(models.Manager):
    def _get_opts(self, model, for_concrete_model):
        if for_concrete_model:
            model = model._meta.concrete_model
        elif model._deferred:
            model = model._meta.proxy_for_model
        return model._meta

    def _get_from_cache(self, opts):
+7 −2
Original line number Diff line number Diff line
@@ -5,10 +5,11 @@ objects corresponding to geographic model fields.

Thanks to Robert Coup for providing this functionality (see #4322).
"""
from django.db.models.query_utils import DeferredAttribute
from django.utils import six


class SpatialProxy(object):
class SpatialProxy(DeferredAttribute):
    def __init__(self, klass, field):
        """
        Proxy initializes on the given Geometry or Raster class (not an instance)
@@ -16,6 +17,7 @@ class SpatialProxy(object):
        """
        self._field = field
        self._klass = klass
        super(SpatialProxy, self).__init__(field.attname, klass)

    def __get__(self, instance, cls=None):
        """
@@ -29,7 +31,10 @@ class SpatialProxy(object):
            return self

        # Getting the value of the field.
        try:
            geo_value = instance.__dict__[self._field.attname]
        except KeyError:
            geo_value = super(SpatialProxy, self).__get__(instance, cls)

        if isinstance(geo_value, self._klass):
            geo_obj = geo_value
+1 −2
Original line number Diff line number Diff line
@@ -37,8 +37,7 @@ class Serializer(base.Serializer):
        self._current = None

    def get_dump_object(self, obj):
        model = obj._meta.proxy_for_model if obj._deferred else obj.__class__
        data = OrderedDict([('model', force_text(model._meta))])
        data = OrderedDict([('model', force_text(obj._meta))])
        if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'):
            data["pk"] = force_text(obj._get_pk_val(), strings_only=True)
        data['fields'] = self._current
Loading