2

请考虑以下用例。

Post模型,也有Tag模型。他们俩之间都有many-to-many关系。Apost可以有多个tags,而 atag可以有多个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,反之亦然,但我不知道为给定的postand添加新的关联tag

请参阅下面的屏幕截图,了解我如何查询彼此的相关tags和关闭。posts

在此处输入图像描述

如果我在这里遗漏了什么,请告诉我。

谢谢

4

1 回答 1

0

我窥视了一些我的旧代码,设置模型如下:

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)

因此,当您创建一个新 Post 时,您可以在不直接引用 posttag 表的情况下为其添加标签:

post = Post(name="foo")

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

session = Session()
session.add(post)
session.commit()
于 2019-08-12T09:46:43.483 回答