[英]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)
parent = relation('Tag')
-参见http://www.sqlalchemy.org/docs/05/reference/ext/declarative.html#configuring-relations 。
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
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.