From b114fecfe4ac817d780205a21424610ea600907b Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Wed, 16 Apr 2008 08:09:18 +0000 Subject: [PATCH] queryset-refactor: Fixed a few inadvertent sharing problems for related fields in abstract base classes. This means, for example, that many-to-many fields can be used in abstract base classes. git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@7431 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/base.py | 3 ++- django/db/models/fields/__init__.py | 13 ++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/django/db/models/base.py b/django/db/models/base.py index 6fad7070ba..40af8a0ed9 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -1,3 +1,4 @@ +import copy import types import sys import os @@ -111,7 +112,7 @@ class ModelBase(type): if field.name in names: raise FieldError('Local field %r in class %r clashes with field of similar name from abstract base class %r' % (field.name, name, base.__name__)) - new_class.add_to_class(field.name, field) + new_class.add_to_class(field.name, copy.deepcopy(field)) if abstract: # Abstract base models can't be instantiated and don't appear in diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 6e426318f5..7778117fb3 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -1,3 +1,4 @@ +import copy import datetime import os import time @@ -126,11 +127,13 @@ class Field(object): return cmp(self.creation_counter, other.creation_counter) def __deepcopy__(self, memodict): - # Slight hack; deepcopy() is difficult to do on classes with - # dynamically created methods. Fortunately, we can get away with doing - # a shallow copy in this particular case. - import copy - return copy.copy(self) + # We don't have to deepcopy very much here, since most things are not + # intended to be altered after initial creation. + obj = copy.copy(self) + if self.rel: + obj.rel = copy.copy(self.rel) + memodict[id(self)] = obj + return obj def to_python(self, value): """