summaryrefslogtreecommitdiff
path: root/django/db/models
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2009-03-04 10:39:29 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2009-03-04 10:39:29 +0000
commit7197a4dcb7de7085e04f1b4edfb31eacb7dd885c (patch)
tree9b189b93af2f8c6270994b4a13fcb5d471443785 /django/db/models
parentf9c8eeb31133d3bf55ae167168fcb2d90ce4d12a (diff)
Made it explicit if you accidentally override a Field from a parent model.
This was always not working reliably (model initialization and serialization were two of the problems). Now, it's an explicit error. Also, documented. Fixed #10252. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9974 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models')
-rw-r--r--django/db/models/base.py22
1 files changed, 12 insertions, 10 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index c7445672ee..50a701dce2 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -94,6 +94,16 @@ class ModelBase(type):
new_class._meta.virtual_fields
field_names = set([f.name for f in new_fields])
+ parent_fields = base._meta.local_fields + base._meta.local_many_to_many
+ # Check for clashes between locally declared fields and those
+ # on the base classes (we cannot handle shadowed fields at the
+ # moment).
+ for field in parent_fields:
+ if field.name in field_names:
+ raise FieldError('Local field %r in class %r clashes '
+ 'with field of similar name from '
+ 'base class %r' %
+ (field.name, name, base.__name__))
if not base._meta.abstract:
# Concrete classes...
if base in o2o_map:
@@ -107,16 +117,7 @@ class ModelBase(type):
else:
# .. and abstract ones.
-
- # Check for clashes between locally declared fields and those
- # on the ABC.
- parent_fields = base._meta.local_fields + base._meta.local_many_to_many
for field in parent_fields:
- if field.name in field_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, copy.deepcopy(field))
# Pass any non-abstract parent classes onto child.
@@ -131,7 +132,8 @@ class ModelBase(type):
new_manager = manager._copy_to_model(new_class)
new_class.add_to_class(mgr_name, new_manager)
- # Inherit virtual fields (like GenericForeignKey) from the parent class
+ # Inherit virtual fields (like GenericForeignKey) from the parent
+ # class
for field in base._meta.virtual_fields:
if base._meta.abstract and field.name in field_names:
raise FieldError('Local field %r in class %r clashes '\