From d88688014f7fca77fb18530d36dd77e10b4bcb82 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Wed, 3 Sep 2008 18:38:43 +0000 Subject: [PATCH] Fixed #7588 -- Inherit fields from concrete ancestor classes via abstract base classes. Based on a patch from emulbreh. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8932 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/base.py | 11 ++++++++--- .../model_inheritance_regress/models.py | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/django/db/models/base.py b/django/db/models/base.py index da3d0e77f2..f94d25c9f5 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -94,8 +94,8 @@ class ModelBase(type): new_class._meta.virtual_fields field_names = set([f.name for f in new_fields]) - # Concrete classes... if not base._meta.abstract: + # Concrete classes... if base in o2o_map: field = o2o_map[base] field.primary_key = True @@ -107,9 +107,11 @@ class ModelBase(type): new_class.add_to_class(attr_name, field) new_class._meta.parents[base] = field - # .. and abstract ones. else: - # Check for clashes between locally declared fields and those on the ABC. + # .. 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: @@ -119,6 +121,9 @@ class ModelBase(type): (field.name, name, base.__name__)) new_class.add_to_class(field.name, copy.deepcopy(field)) + # Pass any non-abstract parent classes onto child. + new_class._meta.parents.update(base._meta.parents) + # Inherit managers from the abstract base classes. base_managers = base._meta.abstract_managers base_managers.sort() diff --git a/tests/regressiontests/model_inheritance_regress/models.py b/tests/regressiontests/model_inheritance_regress/models.py index 5e79068461..2777d1f23a 100644 --- a/tests/regressiontests/model_inheritance_regress/models.py +++ b/tests/regressiontests/model_inheritance_regress/models.py @@ -77,6 +77,16 @@ class M2MBase(models.Model): class M2MChild(M2MBase): name = models.CharField(max_length=50) +class Evaluation(Article): + quality = models.IntegerField() + + class Meta: + abstract = True + +class QualityControl(Evaluation): + assignee = models.CharField(max_length=50) + + __test__ = {'API_TESTS':""" # Regression for #7350, #7202 # Check that when you create a Parent object with a specific reference to an @@ -242,4 +252,9 @@ DoesNotExist: ArticleWithAuthor matching query does not exist. >>> M2MChild.objects.filter(articles__isnull=False) [] +# All fields from an ABC, including those inherited non-abstractly should be +# available on child classes (#7588). Creating this instance should work +# without error. +>>> _ = QualityControl.objects.create(headline="Problems in Django", pub_date=datetime.datetime.now(), quality=10, assignee="adrian") + """}