SQLAlchemy - 映射自引用关系为一对多(声明式)
我想用声明式的方法在SQLAlchemy中映射一个标签(Tag)实体。一个标签可以有一个父标签(也就是另一个标签)。
我已经有了:
class Tag(Base):
__tablename__ = 'tag'
id = Column(Integer, primary_key=True)
label = Column(String)
def __init__(self, label, parentTag=None):
self.label = label
我该如何添加“父标签”的关系呢?
4 个回答
3
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>]
使用:
8
如果你需要子元素,就得使用 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)
118
你需要添加一个 ForeignKey
,这个外键指向父级,然后通过 remote_side
来创建一个指定方向的关系。关于这个内容,可以在 邻接列表关系 的文档中找到。对于声明式的写法,你可以这样做:
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])
如果你还想要反向关系,可以在关系定义中加上 backref='children'
。