2009-10-05 5 views
0

Я пытаюсь определить модель SQLAlchemy/Elixer, которая может описывать следующее отношение. У меня есть таблица SSP, которая имеет несколько внешних ключей для таблицы POC. Я правильно определил отношения ManyToOne в объекте SSP (это позволяет мне правильно установить SSP.get(1).action.first_name). То, что я хотел бы добавить, это другая сторона этих отношений, где я могу выполнить что-то вроде POC.get(1).csa и вернуть список объектов SSP, в которых этот POC определяется как idPOCCSA.Python SQLAlchemy/Elixer Вопрос

Я знаю, что это было бы лучше всего для полиморфной ассоциации, но я действительно не могу вообще изменить схему БД (создание новой таблицы poc2ssp со столбцом для ассоциации type).

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') 

Любые идеи для достижения этой цели? В FAQ Elixer есть хороший пример использования параметров primaryjoin и foreign_keys, но я не могу найти их в документации. Я как бы надеялся, что OneToMany() просто поддерживает параметр colname, такой как ManyToOne(). Что-то немного менее подробное.

ответ

1

Попробуйте следующее:

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

прекрасно работает, я использовал обратный с отношением OneToOne(), не думает, чтобы применить его к OneToMany(). –