2009-10-05 8 views
0

J'essaie de définir un modèle SQLAlchemy/Elixer qui peut décrire la relation suivante. J'ai une table SSP, qui a plusieurs clés étrangères à la table POC. J'ai défini les relations ManyToOne correctement dans l'objet SSP (ce qui me permet de SSP.get(1).action.first_name correctement). Ce que je voudrais également ajouter est l'autre côté de cette relation, où je peux effectuer quelque chose comme POC.get(1).csa et retourner une liste d'objets SSP dans lequel ce POC est défini comme idPOCCSA.Python SQLAlchemy/Elixer Question

Je sais que ce serait mieux pour une association polymorphique mais je ne peux pas du tout changer le schéma DB (créer une nouvelle table poc2ssp avec une colonne pour type d'association).

class POC(Entity): 
    using_options(tablename = 'poc', autoload = True) 

    # These two line visually display my "issue": 
    # csa = OneToMany('SSP') 
    # action = OneToMany('SSP') 


class SSP(Entity): 
    ''' 
    Many to One Relationships: 
    - csa: ssp.idPOCCSA = poc.id 
    - action: ssp.idPOCAction = poc.id 
    - super: ssp.idSuper = poc.id 
    ''' 
    using_options(tablename = 'spp', autoload = True) 

    csa = ManyToOne('POC', colname = 'idPOCCSA') 
    action = ManyToOne('POC', colname = 'idPOCAction') 
    super = ManyToOne('POC', colname = 'idPOCSuper') 

Toutes les idées pour y parvenir? La FAQ Elixer a un bon exemple en utilisant les paramètres primaryjoin et foreign_keys mais je ne les trouve pas dans la documentation. J'espérais que OneToMany() ne supporte qu'un paramètre de nom de col comme ManyToOne(). Quelque chose d'un peu moins verbeux.

Répondre

1

les opérations suivantes:

class POC(Entity): 
    # ... 
    #declare the one-to-many relationships 
    csas = OneToMany('SSP') 
    actions = OneToMany('SSP') 
    # ... 

class SSP(Entity): 
    # ... 
    #Tell Elixir how to disambiguate POC/SSP relationships by specifying 
    #the inverse explicitly. 
    csa = ManyToOne('POC', colname = 'idPOCCSA', inverse='csas') 
    action = ManyToOne('POC', colname = 'idPOCAction', inverse='actions') 
    # ...  
+0

fonctionne parfaitement, j'utilisais inverse avec une relation OneToOne(), ne pense pas à l'appliquer à la OneToMany(). –