Show
Ignore:
Timestamp:
07/16/07 18:33:36 (6 years ago)
Author:
ged
Message:

- Reworked how entities look for primary keys on related entities. This

enables one "normal" entity (fully defined in Elixir) to refer to an entity
which is autoloaded.

- Added translation (from column name to column object) of the primary_key

mapper option so that it can actually be used. This allows to have entities
without any primary key defined at the table level.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • elixir/trunk/elixir/entity.py

    r139 r145  
    4040        self.module = sys.modules[entity.__module__] 
    4141 
    42         self.primary_keys = list() 
     42        self.has_pk = False 
    4343 
    4444        self.parent = None 
     
    7575        for option_dict in ('mapper_options', 'table_options'): 
    7676            setattr(self, option_dict, options_defaults[option_dict].copy()) 
    77      
     77    
    7878    def setup_options(self): 
    7979        ''' 
     
    169169        self.delayed_properties.clear() 
    170170 
     171        if 'primary_key' in kwargs: 
     172            cols = self.entity.table.c 
     173            kwargs['primary_key'] = [getattr(cols, colname) for 
     174                colname in kwargs['primary_key']] 
     175 
    171176        assign_mapper(session.context, self.entity, self.entity.table, 
    172177                      properties=properties, **kwargs) 
     
    200205                     
    201206                self.entity.table = self.parent.table  
    202                 self.primary_keys = self.parent._descriptor.primary_keys 
    203207 
    204208                # re-add the entity fields to the parent entity so that they 
    205209                # are added to the parent's table (whether the parent's table 
    206                 # is setup already or not). 
     210                # is already setup or not). 
    207211                for field in self.fields.itervalues(): 
    208212                    self.parent._descriptor.add_field(field) 
     
    222226 
    223227        if not self.autoload: 
    224             if not self.primary_keys and self.auto_primarykey: 
     228            if not self.has_pk and self.auto_primarykey: 
    225229                self.create_auto_primary_key() 
    226230 
     
    238242                                  *args, **kwargs) 
    239243     
     244    def primary_keys(self): 
     245        return [col for col in self.entity.table.primary_key.columns] 
     246    primary_keys = property(primary_keys) 
     247 
    240248    def create_auto_primary_key(self): 
    241249        ''' 
     
    243251        ''' 
    244252         
    245         assert not self.primary_keys and self.auto_primarykey 
     253        assert not self.has_pk and self.auto_primarykey 
    246254         
    247255        if isinstance(self.auto_primarykey, basestring): 
     
    257265         
    258266        if field.primary_key: 
    259             self.primary_keys.append(field) 
     267            self.has_pk = True 
    260268         
    261269        table = self.entity.table