Python SQLAlchemy-将自引用关系映射为一对多(声明形式)
我想使用声明性方法和SQLAlchemy映射标记实体。标记可以有父标记(另一个标记) 我有:Python SQLAlchemy-将自引用关系映射为一对多(声明形式),python,sqlalchemy,Python,Sqlalchemy,我想使用声明性方法和SQLAlchemy映射标记实体。标记可以有父标记(另一个标记) 我有: class Tag(Base): __tablename__ = 'tag' id = Column(Integer, primary_key=True) label = Column(String) def __init__(self, label, parentTag=None): self.label = label 如何添加“父项”关系?pa
class Tag(Base):
__tablename__ = 'tag'
id = Column(Integer, primary_key=True)
label = Column(String)
def __init__(self, label, parentTag=None):
self.label = label
如何添加“父项”关系?
parent=relation('Tag')
-请参阅。您添加一个引用父项的外键
,然后创建一个通过远端
指定方向的关系。这在下有记录。对于声明式,您可以执行以下操作:
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'
添加到关系定义中。如果需要子关系,则需要使用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)
使用:
[2]中的:company\u query=company.query.get\u或\u 404(1)
在[3]中:company\u query.children\u company
出[3]:
[,
]
我尝试了此操作,但出现了一个错误:sqlalchemy.exc.ArgumentError:无法确定relationship Tag.parent上的父/子表之间的联接条件。指定“primaryjoin”表达式。如果这是一种多对多关系,那么还需要“secondaryjoin”。感谢留言,你需要parent\u id=Column(Integer,ForeignKey('tag.id'))
为了避免这个错误,url移到了@NathanVillaescusa谢谢,我已经修复了链接。url再次移到了。我可以使用tag.parent.parent.label作为祖父母的标签吗?这个“关系”是“关系”的基本元素吗。
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>]