diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2009-03-04 10:39:29 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2009-03-04 10:39:29 +0000 |
| commit | 7197a4dcb7de7085e04f1b4edfb31eacb7dd885c (patch) | |
| tree | 9b189b93af2f8c6270994b4a13fcb5d471443785 /django | |
| parent | f9c8eeb31133d3bf55ae167168fcb2d90ce4d12a (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')
| -rw-r--r-- | django/db/models/base.py | 22 |
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 '\ |
