Commit d8868801 authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

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
parent 9a89d1eb
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -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()
+15 −0
Original line number Diff line number Diff line
@@ -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")

"""}