Как вставить много-много записей?

Пожалуйста, рассмотрите следующий вариант использования.

Существует Post модель, а также Tag модель. У них обоих есть many-to-many отношения между ними. post может иметь несколько tags в то время как tag может иметь несколько posts,

Чтобы достичь этого варианта использования, я реализовал таблицу отображения, которая называется PostTag и это выглядит следующим образом

from database.base import Base
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.orm import relationship
from .model_post import ModelPost
from .model_tag import ModelTag


class PostTag(Base):
   __tablename__ = 'posttag'
   post_id = Column("post_id",Integer, ForeignKey('post.id'), primary_key = True)
   tag_id = Column("tag_id",Integer, ForeignKey('tag.id'), primary_key = True)

С этой настройкой я могу успешно запросить все tags для данного post и наоборот, но я не знаю, чтобы добавить новую ассоциацию для данного post а также tag,

Пожалуйста, смотрите скриншот ниже, как я запрашиваю tags а также posts друг от друга

Если здесь есть что-то, чего мне не хватает, пожалуйста, дайте мне знать.

Спасибо

1 ответ

Я заглянул в мой старый код, установив такие модели:

from sqlalchemy.orm import sessionmaker

posttag = Table(
    "posttag",
    Base.metadata,
    Column("id", INTEGER, Sequence("seq_posttag_id"), primary_key=True),
    Column("post_id", INTEGER, ForeignKey("post.id")),
    Column("tag_id", INTEGER, ForeignKey("tag.id")),
)


class ModelTag(Base):
    __tablename__ = "tag"

    id = Column(INTEGER, Sequence("seq_tag_id"), primary_key=True)
    name = Column(VARCHAR(40), nullable=False)


class ModelPost(Base):
    __tablename__ = "post"

    id = Column(INTEGER, Sequence("seq_post_id"), primary_key=True)
    name = Column(VARCHAR(100), nullable=False)
    tags = relationship(Tag, secondary=posttag)

И поэтому, когда вы создаете новую публикацию, вы добавляете к ней тег без прямой ссылки на таблицу posttag:

post = Post(name="foo")

tag = session.query(ModelTag).filter_by(name='some').first()
post.append(tag)

session = Session()
session.add(post)
session.commit()
Другие вопросы по тегам