author_book_table = Table(
"AuthorBook", # имя таблицы
Base.metadata,
Column("author", ForeignKey("author.id"), primary_key=True),
Column("book", ForeignKey("book.id"), primary_key=True),
)
class Author(Base):
__tablename__ = "author"
id = Column(Integer, primary_key=True)
name = Column(String(50))
books = relationship(
"Book", # на какую таблицу мы ссылаемся?
secondary=author_book_table, # какую таблицу используем для связи?
back_populates="authors" # какое свойство в объектах таблицы на другом конце связи?
)
class Book(Base):
__tablename__ = "book"
id = Column(Integer, primary_key=True)
title = Column(String(255))
authors = relationship(
"Author", # на какую таблицу мы ссылаемся?
secondary=author_book_table, # какую таблицу используем для связи?
back_populates="books" # какое свойство в объектах таблицы на другом конце связи?
)
author = Author(name="author 2")
book = Book(title="Great Big Book of Everything")
session.add(author)
session.add(book)
book.authors.append(author)
session.commit()
association_table = Table(
"association", # имя таблицы
Base.metadata,
Column("left_id", ForeignKey("left.id"), primary_key=True), # поле ссылается на ключ Parent
Column("right_id", ForeignKey("right.id"), primary_key=True), # поле ссылается на ключ Child
)
class Parent(Base):
__tablename__ = "left" # обрати внимание на имя таблицы - сравни с ссылкой в association_table
id = Column(Integer, primary_key=True)
children = relationship(
"Child", # на какую таблицу мы ссылаемся?
secondary=association_table, # какую таблицу используем для связи?
back_populates="parents" # какое свойство в объектах таблицы на другом конце связи?
)
class Child(Base):
__tablename__ = "right" # обрати внимание на имя таблицы - сравни с ссылкой в association_table
id = Column(Integer, primary_key=True)
parents = relationship(
"Parent", # на какую таблицу мы ссылаемся?
secondary=association_table, # какую таблицу используем для связи?
back_populates="children" # какое свойство в объектах таблицы на другом конце связи?
)
# это удалит строку из связной таблицы
myparent.children.remove(somechild)
# а можно и так
somechild.parents.remove(myparent)