Django

Code

Changeset 8932

Show
Ignore:
Timestamp:
09/03/08 13:38:43 (4 months ago)
Author:
mtredinnick
Message:

Fixed #7588 -- Inherit fields from concrete ancestor classes via abstract base
classes. Based on a patch from emulbreh.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/db/models/base.py

    r8908 r8932  
    9595            field_names = set([f.name for f in new_fields]) 
    9696 
    97             # Concrete classes... 
    9897            if not base._meta.abstract: 
     98                # Concrete classes... 
    9999                if base in o2o_map: 
    100100                    field = o2o_map[base] 
     
    108108                new_class._meta.parents[base] = field 
    109109 
    110             # .. and abstract ones. 
    111             else: 
    112                 # Check for clashes between locally declared fields and those on the ABC. 
     110            else: 
     111                # .. and abstract ones. 
     112 
     113                # Check for clashes between locally declared fields and those 
     114                # on the ABC. 
    113115                parent_fields = base._meta.local_fields + base._meta.local_many_to_many 
    114116                for field in parent_fields: 
     
    119121                                            (field.name, name, base.__name__)) 
    120122                    new_class.add_to_class(field.name, copy.deepcopy(field)) 
     123 
     124                # Pass any non-abstract parent classes onto child. 
     125                new_class._meta.parents.update(base._meta.parents) 
    121126 
    122127            # Inherit managers from the abstract base classes. 
  • django/trunk/tests/regressiontests/model_inheritance_regress/models.py

    r8908 r8932  
    7777class M2MChild(M2MBase): 
    7878    name = models.CharField(max_length=50) 
     79 
     80class Evaluation(Article): 
     81    quality = models.IntegerField() 
     82 
     83    class Meta: 
     84        abstract = True 
     85 
     86class QualityControl(Evaluation): 
     87    assignee = models.CharField(max_length=50) 
     88 
    7989 
    8090__test__ = {'API_TESTS':""" 
     
    243253[] 
    244254 
     255# All fields from an ABC, including those inherited non-abstractly should be 
     256# available on child classes (#7588). Creating this instance should work 
     257# without error. 
     258>>> _ = QualityControl.objects.create(headline="Problems in Django", pub_date=datetime.datetime.now(), quality=10, assignee="adrian") 
     259 
    245260"""}