summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-09-03 18:38:43 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-09-03 18:38:43 +0000
commitd88688014f7fca77fb18530d36dd77e10b4bcb82 (patch)
tree67653a0ae5b7e72fb079e542689c81a16685d6b9
parent9a89d1eb9f0b651a5ead0c9d41817c6bce6e8c1a (diff)
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
-rw-r--r--django/db/models/base.py11
-rw-r--r--tests/regressiontests/model_inheritance_regress/models.py15
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")
+
"""}