Python SQLAlchemy / Elixer Вопрос - PullRequest
       21

Python SQLAlchemy / Elixer Вопрос

0 голосов
/ 05 октября 2009

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

Я знаю, что это было бы лучше для полиморфной ассоциации, но я действительно не могу изменить схему БД вообще (создав новую таблицу 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 Ответ

1 голос
/ 05 октября 2009

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

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