Python 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

我想使用声明性方法和SQLAlchemy映射标记实体。标记可以有父标记(另一个标记)

我有:

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>]