Ticket #12121: t12121-r11683.diff

File t12121-r11683.diff, 1.9 KB (added by russellm, 6 years ago)

Possible patch for weird reduce behavior.

  • django/db/models/base.py

    diff -r eff0b46ff6fa django/db/models/base.py
    a b  
    352352        only module-level classes can be pickled by the default path.
    353353        """
    354354        data = self.__dict__
    355         if not self._deferred:
    356             return super(Model, self).__reduce__()
     355        model = self.__class__
     356        # The obvious thing to do here is to invoke super().__reduce__()
     357        # for the non-deferred case. Don't do that.
     358        # On Python 2.4, there is something wierd with __reduce__,
     359        # and as a result, the super call will cause an infinite recursion.
     360        # See #10547 and #12121.
    357361        defers = []
    358362        pk_val = None
    359         for field in self._meta.fields:
    360             if isinstance(self.__class__.__dict__.get(field.attname),
    361                     DeferredAttribute):
    362                 defers.append(field.attname)
    363                 if pk_val is None:
    364                     # The pk_val and model values are the same for all
    365                     # DeferredAttribute classes, so we only need to do this
    366                     # once.
    367                     obj = self.__class__.__dict__[field.attname]
    368                     model = obj.model_ref()
     363        if self._deferred:
     364            for field in self._meta.fields:
     365                if isinstance(self.__class__.__dict__.get(field.attname),
     366                        DeferredAttribute):
     367                    defers.append(field.attname)
     368                    if pk_val is None:
     369                        # The pk_val and model values are the same for all
     370                        # DeferredAttribute classes, so we only need to do this
     371                        # once.
     372                        obj = self.__class__.__dict__[field.attname]
     373                        model = obj.model_ref()
    369374
    370375        return (model_unpickle, (model, defers), data)
    371376
Back to Top