Как построить отношения «многие ко многим» с помощью SQLAlchemy: хороший пример

Я прочитал документацию SQLAlchemy и руководство по построению отношения «многие ко многим», но я не мог понять, как это сделать правильно, когда таблица ассоциации содержит больше двух внешних ключей.

У меня есть таблица предметов, и у каждого предмета есть много деталей. Детали могут быть одинаковыми для многих элементов, поэтому между элементами и деталями существует соотношение «многие-ко-многим»

У меня есть следующее:

class Item(Base): __tablename__ = 'Item' id = Column(Integer, primary_key=True) name = Column(String(255)) description = Column(Text) class Detail(Base): __tablename__ = 'Detail' id = Column(Integer, primary_key=True) name = Column(String) value = Column(String) 

Моя таблица связей (она определена перед другими 2 в коде):

 class ItemDetail(Base): __tablename__ = 'ItemDetail' id = Column(Integer, primary_key=True) itemId = Column(Integer, ForeignKey('Item.id')) detailId = Column(Integer, ForeignKey('Detail.id')) endDate = Column(Date) 

В документации говорится, что мне нужно использовать «объект ассоциации». Я не мог понять, как правильно использовать его, поскольку он смешанный декларативный с формами картографа, и примеры, похоже, не полны. Я добавил строку:

 details = relation(ItemDetail) 

как член класса Item и строки:

 itemDetail = relation('Detail') 

как член таблицы ассоциаций, как описано в документации.

когда я делаю item = session.query (Item) .first (), item.details – это не список объектов Detail, а список объектов ItemDetail.

Как я могу правильно получить детали объектов Item, т. Е. Item.details должен быть списком объектов Detail?

One Solution collect form web for “Как построить отношения «многие ко многим» с помощью SQLAlchemy: хороший пример”

Из комментариев, которые я вижу, вы нашли ответ. Но документация SQLAlchemy довольно подавляющая для «нового пользователя», и я боролся с тем же вопросом. Итак, для справок в будущем:

 ItemDetail = Table('ItemDetail', Column('id', Integer, primary_key=True), Column('itemId', Integer, ForeignKey('Item.id')), Column('detailId', Integer, ForeignKey('Detail.id')), Column('endDate', Date)) class Item(Base): __tablename__ = 'Item' id = Column(Integer, primary_key=True) name = Column(String(255)) description = Column(Text) details = relationship('Detail', secondary=ItemDetail, backref='Item') class Detail(Base): __tablename__ = 'Detail' id = Column(Integer, primary_key=True) name = Column(String) value = Column(String) items = relationship('Item', secondary=ItemDetail, backref='Detail') 
  • sqlalchemy CompileError Неиспользуемые имена столбцов при удалении строки из таблицы m2m
  • SQLAlchemy - order_by по отношениям для таблицы соединений
  • Избегание кода обработки сеанса шаблона в функциях sqlalchemy
  • Выполнить несколько независимых операторов в SQLAlchemy Core?
  • Правильный способ предотвратить повторение запросов SQLAlchemy на истекших объектах?
  • как использовать много-ко-многим в sqlalchemy
  • Список баз данных в SQLAlchemy
  • не удалось создать автоинкрементный первичный ключ с фляжкой-sqlalchemy
  • Python - лучший язык программирования в мире.