【问题标题】:How can I access subclasses from upper class in sqlalchemy?如何从 sqlalchemy 中的上层访问子类?
【发布时间】:2020-11-07 15:45:08
【问题描述】:

我有 3 节课;

  • 'Company' 顶级类它的子类'Department' 它的子类'DepartmentalUnit'

  • 我可以访问从'DepartmentalUnit'类到顶级'Company'所有类的值

尽管阅读了文档,但我无法做到和理解的是;;

  • 我无法访问“公司”类的其他子类
class Company(Base):
    __tablename__ = 'company'

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

    departments = relationship('Department',backref='company')


class Department(Base):
    __tablename__ = 'department'

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

    company_id = Column(Integer, ForeignKey('company.id'))
    departmentalunits = relationship('DepartmentalUnit', backref='department')


class DepartmentalUnit(Base):

    __tablename__ = 'departmentalunit'

    id = Column(Integer, primary_key=True,nullable=False)
    departmental_unit_name = Column(String)

    departments_id = Column(Integer, ForeignKey('department.id'))

我从子类访问上层类的代码:

query = session.query(DepartmentalUnit)
instance = query.all()

for i in instance:
    print(i.department.company.name)
    print(i.department.department_name)
    print(i.departmental_unit_name)

无法从公司类访问其他子类的代码:

query = session.query(Company)
instance = query.all()

for i in instance:
    print(i.department.department_name)

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    您的最后一个查询应该以不同的方式使用:

    • 关系名称中有错字:应该是departments 而不是department
    • 鉴于关系是 1-N,结果是一个列表,因此您应该遍历子级。

    这应该可行:

    query = session.query(Company)
    
    for company in query.all():
        print(company.name)
        for dep in company.departments:
            print("  ", dep.department_name)
            for dep_unit in dep.departmentalunits:
                print("    ", dep_unit.departmental_unit_name)
    

    【讨论】:

    • 我通过在关系中添加 backref 解决了这个问题。非常感谢。
    【解决方案2】:

    我解决了这个问题。我为关系添加了一个反向引用,现在我可以从公司访问所有这些。不确定这是否是正确的方法?但是,我目前正在获得我想要的回报。我还没有未答复的请求。

    示例已解决:

    class Company(Base):
        __tablename__ = 'company'
    
        id = Column(Integer, primary_key=True)
        name = Column(String)
    
        departments = relationship('Department',backref='company',uselist=False)
    
    
    class Department(Base):
        __tablename__ = 'department'
    
        id = Column(Integer, primary_key=True)
        department_name = Column(String)
    
        company_id = Column(Integer, ForeignKey('company.id'))
        departmentalunits = relationship('DepartmentalUnit', backref='department',uselist=False)
    
    class DepartmentalUnit(Base):
    
        __tablename__ = 'departmentalunit'
    
        id = Column(Integer, primary_key=True,nullable=False)
        departmental_unit_name = Column(String)
    
        departments_id = Column(Integer, ForeignKey('department.id'))
    
    
    query = session.query(Company)
    instance = query.all()
    
    for i in instance:
        print(f"Company: {i.name}")
    
        print(f"Department: {i.departments.department_name}")
    
        print(f"Department Unit: {i.departments.departmentalunits.departmental_unit_name}")
    
        print( f"Report Category : {i.departments.departmentalunits.reportcategoryoftheunit.report_category_name}")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多