summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-04-16 08:09:18 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-04-16 08:09:18 +0000
commitb114fecfe4ac817d780205a21424610ea600907b (patch)
tree381922aa35cbcad2e4361eaf692abd8bb9aa76d6
parenta14135e14fa79fe55dcb56cfeb102d07be166dde (diff)
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
-rw-r--r--django/db/models/base.py3
-rw-r--r--django/db/models/fields/__init__.py13
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):
"""