mirror of https://github.com/django/django.git
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
This commit is contained in:
parent
9a89d1eb9f
commit
d88688014f
|
@ -94,8 +94,8 @@ class ModelBase(type):
|
||||||
new_class._meta.virtual_fields
|
new_class._meta.virtual_fields
|
||||||
field_names = set([f.name for f in new_fields])
|
field_names = set([f.name for f in new_fields])
|
||||||
|
|
||||||
# Concrete classes...
|
|
||||||
if not base._meta.abstract:
|
if not base._meta.abstract:
|
||||||
|
# Concrete classes...
|
||||||
if base in o2o_map:
|
if base in o2o_map:
|
||||||
field = o2o_map[base]
|
field = o2o_map[base]
|
||||||
field.primary_key = True
|
field.primary_key = True
|
||||||
|
@ -107,9 +107,11 @@ class ModelBase(type):
|
||||||
new_class.add_to_class(attr_name, field)
|
new_class.add_to_class(attr_name, field)
|
||||||
new_class._meta.parents[base] = field
|
new_class._meta.parents[base] = field
|
||||||
|
|
||||||
# .. and abstract ones.
|
|
||||||
else:
|
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
|
parent_fields = base._meta.local_fields + base._meta.local_many_to_many
|
||||||
for field in parent_fields:
|
for field in parent_fields:
|
||||||
if field.name in field_names:
|
if field.name in field_names:
|
||||||
|
@ -119,6 +121,9 @@ class ModelBase(type):
|
||||||
(field.name, name, base.__name__))
|
(field.name, name, base.__name__))
|
||||||
new_class.add_to_class(field.name, copy.deepcopy(field))
|
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.
|
# Inherit managers from the abstract base classes.
|
||||||
base_managers = base._meta.abstract_managers
|
base_managers = base._meta.abstract_managers
|
||||||
base_managers.sort()
|
base_managers.sort()
|
||||||
|
|
|
@ -77,6 +77,16 @@ class M2MBase(models.Model):
|
||||||
class M2MChild(M2MBase):
|
class M2MChild(M2MBase):
|
||||||
name = models.CharField(max_length=50)
|
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':"""
|
__test__ = {'API_TESTS':"""
|
||||||
# Regression for #7350, #7202
|
# Regression for #7350, #7202
|
||||||
# Check that when you create a Parent object with a specific reference to an
|
# 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)
|
>>> 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…
Reference in New Issue