LINUX.ORG.RU

association_proxy для одной таблицы

 ,


0

2

Есть отношение многое ко многим для одной таблицы, т.е. элементы в этой таблицы могут быть подъэлементами из той же таблицы.

Для этого сделал две таблички:

class Item(Base):
  __tablename__ = 'items'

  id = Column(String, nullable=False, primary_key=True)
  name = Column(String, unique=True, nullable=False)

  set_item = relationship("ItemSet", foreign_keys="ItemSet.set_id")
  item_set = relationship("ItemSet", foreign_keys="ItemSet.item_id")

class ItemSet(Base):
  __tablename__ = 'item_set'

  item_id = Column(String, ForeignKey('items.id', onupdate="CASCADE", ondelete="CASCADE"), primary_key=True)
  set_id = Column(String, ForeignKey('items.id', onupdate="CASCADE", ondelete="CASCADE"), primary_key=True)

  item = relationship("Item", foreign_keys='ItemSet.item_id')
  items_set = relationship("Item", foreign_keys='ItemSet.set_id')

Отношения вроде работают, а вот добавить association_proxy, чтобы сразу выбирались все подэлементы или элементы в которые входит текущий никак не выходит. Пробую что-то в этом духе:

  items = association_proxy(ItemSet.__tablename__, 'item')
  sets = association_proxy(ItemSet.__tablename__, 'items_set')
Но судя по результату для обоих используется отношение по item_id.

SqlAlchemy 0.8.1, python 2.7.5

★★

Пока что придумал такой воркэраунд:

  @property
  def items(self):
    if not hasattr(self, 'calculated_items'):
      self.calculated_items = [ db_session.query(Item).filter_by(id = i.item_id).one() for i in self.set_item ]
    return self.calculated_items

  @property
  def sets(self):
    if not hasattr(self, 'calculated_sets'):
      self.calculated_sets = [ db_session.query(Item).filter_by(id = i.set_id).one() for i in self.item_set ]
    return self.calculated_sets

kulti ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.