简体   繁体   English

SQLAlchemy-将自引用关系一对多映射(声明形式)

[英]SQLAlchemy - Mapping self-referential relationship as one to many (declarative form)

I want to map a Tag entity using declarative method with SQLAlchemy. 我想使用SQLAlchemy的声明性方法映射Tag实体。 A tag can have a parent (another Tag). 标签可以有一个父标签(另一个标签)。

I have: 我有:

class Tag(Base):
    __tablename__ = 'tag'

    id = Column(Integer, primary_key=True)
    label = Column(String)

    def __init__(self, label, parentTag=None):
        self.label = label

How can I add the "parent" relationship? 如何添加“父母”关系?

You add a ForeignKey referencing the parent, and then create a relationship that specifies the direction via remote_side . 您添加引用父项的ForeignKey ,然后创建一个通过remote_side指定方向的关系。 This is documented under adjacency list relationships . 这在邻接列表关系下进行了说明 For declarative you'd do something like this: 对于声明式,您可以执行以下操作:

class Tag(Base):
    __tablename__ = 'tag'

    id = Column(Integer, primary_key=True)
    label = Column(String)
    parent_id = Column(Integer, ForeignKey('tag.id'))

    parent = relationship('Tag', remote_side=[id])

If you want the reverse relation also, add backref='children' to the relationship definition. 如果还需要反向关系,则将backref='children'添加到关系定义中。

If you need children, you need to use uselist : 如果您需要孩子,则需要使用uselist

class Tag(Base):
    __tablename__ = 'tag'

    id = Column(Integer, primary_key=True)
    label = Column(String)
    child_id = Column(Integer, ForeignKey('tag.id'))

    children = relation('Tag', remote_side=[id], uselist=True)
class Company(BaseModel):
    __tablename__ = 'companies'
    companyName = db.Column(db.String(50))
    contactPerson = db.Column(db.String(50))
    email = db.Column(db.String(50))
    mobile = db.Column(db.String(20))
    parentID = db.Column(db.Integer, db.ForeignKey('companies.id'))  # parent company ID
    childrenCompany = db.relationship('Company', remote_side='Company.id',
                                    backref=db.backref('children_company'))  # parent Company

use: 采用:

In [2]: company_query = Company.query.get_or_404(1)

In [3]: company_query.children_company
Out[3]: 
[<app.models.user.Company at 0x10f527850>,
 <app.models.user.Company at 0x10f527c10>]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 SQLAlchemy自引用多对一关系:示例 - SQLAlchemy self-referential many-to-one relationship: example SQLAlchemy自引用多对多对称关系 - SQLAlchemy Self-Referential Many to Many Symmetric Relationship 如何在SQLAlchemy中确定自引用一对多关系的方向 - How to determine direction in self-referential one-to-many relationship in SQLAlchemy SQLAlchemy与自引用辅助数据库的关系 - SQLAlchemy relationship with self-referential secondary SQLAlchemy中与过滤器的自引用关系 - Self-referential relationship with filter in SQLAlchemy 带有clarified_attr的SQLAlchemy声明性mixin类上的自引用外键关系 - Self-referential foreign key relationship on SQLAlchemy declarative mixin class with declared_attr Sqlalchemy:自引用多对多关系与关系表中的额外列 - Sqlalchemy: self-referential many-to-many relationship with extra column in relationship table 如何在SQLAlchemy中声明对称自引用多对多关系用于存储有向图 - How to declare symmetric self-referential many-to-many relationship in SQLAlchemy for storing directed graph 通过SqlAlchemy中的关联对象实现多对多,自引用,非对称关系(推特模型) - Many-to-many, self-referential, non-symmetrical relationship (twitter model) via Association Object in SqlAlchemy 使用SqlAlchemy中的关联表一对一的自我引用关系 - One-to-one self-referential relationship using an association table in SqlAlchemy
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM