Loading django/db/models/base.py +8 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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: Loading @@ -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() Loading tests/regressiontests/model_inheritance_regress/models.py +15 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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") """} Loading
django/db/models/base.py +8 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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: Loading @@ -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() Loading
tests/regressiontests/model_inheritance_regress/models.py +15 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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") """}