gpt4 book ai didi

python - 如何正确创建一个 flask sqlalchemy 与多个外键的多对多关系

转载 作者:行者123 更新时间:2023-12-04 17:57:00 25 4
gpt4 key购买 nike

在 Flask sqlalchemy 文档中给出了使用简单多对多关系的示例:

tags = db.Table('tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
)

class Page(db.Model):
id = db.Column(db.Integer, primary_key=True)
tags = db.relationship('Tag', secondary=tags,
backref=db.backref('pages', lazy='dynamic'))

class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)

在哪里可以使用以下语法来联系相关对象:

Page.tags

我想要完成的基本上是将下面的关系添加到上面的关系中:

tag_children = db.Table('tag_children,',
db.Column('parent_id', db.Integer, db.ForeignKey('tags.tag_id')),
db.Column('child_id', db.Integer, db.ForeignKey('tags.tag_id'))
)

这样每个页面都有附加的标签,但每个标签在该页面的范围内可以有多个子标签。我在下面为一个名为 cars 的页面制作了一个展示案例,其中我有它的标签及其各自的子标签。

(页)汽车:

  • 梅赛德斯
    • A 系列
    • B 系列
    • C 系列
  • 特斯拉
    • 特斯拉跑车
    • X 型
    • S 型
    • 模型 3

上面所有的列表项都是标签对象

我希望能够使用下面的语法来获取相关对象:

Page.tag.children

例如(下面明显是伪代码,但我想弄清楚这种关系的预期目的是什么):

Cars.tesla.children

最佳答案

我认为,tag_children 不需要另一个表。尝试使用 SQLAlchemy邻接表:

class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('tag.id'))
children = relationship("Tag",
backref=backref('parent', remote_side=[id])
)

使用此架构,您可以使用如下语法:

for tag in page.tags:  # where page is a Page instance received from db
print tag.children

这是使用 SQLAlchemy 模型的常用语法。尝试使用它代替建议的 Cars.tesla.children

Cars['tesla'].children 之类的东西可以通过 getitem 实现方法,但我认为,这是非常不清楚的方法。

完整代码片段:

class Page(Base):

__tablename__ = 'page'

id = Column(Integer, primary_key=True)
name = Column(String(256))
tags = relationship('Tag', secondary='tags',
backref=backref('pages', lazy='dynamic'))

def __str__(self):
return self.name


class Tag(Base):

__tablename__ = 'tag'

id = Column(Integer, primary_key=True)
name = Column(String(256))
parent_id = Column(Integer, ForeignKey('tag.id'))
children = relationship(
"Tag",
backref=backref('parent', remote_side=[id])
)

def __str__(self):
return self.name

class Tags(Base):
__tablename__ = 'tags'

tag_id = Column(Integer, ForeignKey('tag.id'), primary_key=True)
page_id = Column(Integer, ForeignKey('page.id'), primary_key=True)

和测试用例:

# Create page and tags
session.add(Page(id=1, name="cars"))
session.add(Tag(id=1, name="Mercedes"))
session.add(Tag(id=2, name="A-series", parent_id=1))
session.add(Tag(id=3, name="B-series", parent_id=1))
session.add(Tag(id=4, name="C-series", parent_id=1))
session.add(Tag(id=5, name="Tesla"))
session.add(Tag(id=6, name="Tesla Roadster", parent_id=5))
session.add(Tag(id=7, name="Model X", parent_id=5))
session.add(Tag(id=8, name="Model S", parent_id=5))
session.add(Tag(id=9, name="Model 3", parent_id=5))

# Fill relation
session.add(Tags(tag_id=1, page_id=1))
session.add(Tags(tag_id=5, page_id=1))

session.commit()

print session.query(Page).get(1) # >>> cars
print session.query(Page).get(1).tags # >>> Mercedes, Tesla
print session.query(Page).get(1).tags[1].children # >>> Tesla models

关于python - 如何正确创建一个 flask sqlalchemy 与多个外键的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39697616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com