mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #12121 -- Modified __reduce__ on a model to avoid an infinite recursion problem that occurs on Python 2.4. Thanks to emulbreh for the report.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@11691 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -352,20 +352,25 @@ class Model(object): | ||||
|         only module-level classes can be pickled by the default path. | ||||
|         """ | ||||
|         data = self.__dict__ | ||||
|         if not self._deferred: | ||||
|             return super(Model, self).__reduce__() | ||||
|         model = self.__class__ | ||||
|         # The obvious thing to do here is to invoke super().__reduce__() | ||||
|         # for the non-deferred case. Don't do that. | ||||
|         # On Python 2.4, there is something wierd with __reduce__, | ||||
|         # and as a result, the super call will cause an infinite recursion. | ||||
|         # See #10547 and #12121. | ||||
|         defers = [] | ||||
|         pk_val = None | ||||
|         for field in self._meta.fields: | ||||
|             if isinstance(self.__class__.__dict__.get(field.attname), | ||||
|                     DeferredAttribute): | ||||
|                 defers.append(field.attname) | ||||
|                 if pk_val is None: | ||||
|                     # The pk_val and model values are the same for all | ||||
|                     # DeferredAttribute classes, so we only need to do this | ||||
|                     # once. | ||||
|                     obj = self.__class__.__dict__[field.attname] | ||||
|                     model = obj.model_ref() | ||||
|         if self._deferred: | ||||
|             for field in self._meta.fields: | ||||
|                 if isinstance(self.__class__.__dict__.get(field.attname), | ||||
|                         DeferredAttribute): | ||||
|                     defers.append(field.attname) | ||||
|                     if pk_val is None: | ||||
|                         # The pk_val and model values are the same for all | ||||
|                         # DeferredAttribute classes, so we only need to do this | ||||
|                         # once. | ||||
|                         obj = self.__class__.__dict__[field.attname] | ||||
|                         model = obj.model_ref() | ||||
|  | ||||
|         return (model_unpickle, (model, defers), data) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user