Я пытаюсь понять, как лучше всего построить отношения, которые сопоставляют множество констант со многими элементами.
Мои первоначальные отношения, у Предмета есть Константа, выглядели так.
class Constant(Base):
__tablename__ = "Constant"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(64), nullable=False)
class Item(Base):
__tablename__ = "Item"
id = Column(Integer, primary_key=True, autoincrement=True)
constantId = Column(Integer, ForeignKey("Constant.id"))
constant = relationship("Constant")
Однако мне действительно нужно, чтобы мой элемент имел более одной константы, что-то вроде этого...
class Item(Base):
__tablename__ = "Item"
id = Column(Integer, primary_key=True, autoincrement=True)
constant1Id = Column(Integer, ForeignKey("Constant.id"))
constant1 = relationship("Constant")
constant2Id = Column(Integer, ForeignKey("Constant.id"))
constant2 = relationship("Constant")
Моей первой попыткой было использовать таблицу ассоциаций...
item_to_constant_assoc = Table("itemToConstantAssoc", Base.metadata, Column("constantId", Integer, ForeignKey("Constant.id"), Column("itemId", Integer, ForeignKey("Item.id")))
при обновлении класса Item соответственно:
Class Item(Base):
__tablename__ = "Item"
id = Column(Integer, primary_key=True, autoincrement=True)
constant1 = relationship("Constant", secondary=item_to_constant_assoc, uselist=False)
constant2 = relationship("Constant", secondary=item_to_constant_assoc, uselist=False)
Это не удалось (понятно, если посмотреть на созданные таблицы MySQL), потому что Item.constant1 и Item.constant2 ссылались на одну и ту же запись в таблице ассоциаций.
Мой следующий шаг — добавить еще одну ассоциативную таблицу для второй константы, но я должен задаться вопросом, не ошибаюсь ли я, поскольку я, кажется, создаю большое количество таблиц для относительно простого сопоставления. Я прочитал документацию. Он подробный и содержательный (спасибо Майклу Байеру!), и я мог просто пропустить какой-то раздел. Может ли кто-нибудь дать мне несколько указателей на эту проблему или на то, что я должен искать в документах?
Спасибо! Фил