SQLAlchemy列_属性基础

2024-10-01 09:34:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两种型号:

class Report(Base):
    __tablename__ = 'report'
    id = Column(Integer, primary_key=True)

class ReportPhoto(Base):
    __tablename__ = 'report_photo'
    id = Column(Integer, primary_key=True)
    report_id = Column(Integer, ForeignKey(Report.id), nullable=False)

    report = relationship(Report, uselist=False, backref=backref('report_photo', uselist=True))

我想在报表模型中添加一个列,说明ReportPhoto中是否有任何记录。我尝试这样使用column_property

^{pr2}$

但是得到一个错误NameError: name 'ReportPhoto' is not defined。我怎样才能解决这个问题?在


Tags: keyreportidfalsetruebasecolumninteger
2条回答

我将在@vladimirlliev的回应中补充一些,让其他可能不知道该怎么做的人澄清一下。在

将具有“foreign table reference”列属性的表放在其引用的之后。在本例中,这意味着将Report放在ReportPhoto之后。这将解决名称错误,但是,您将在ReportPhoto外键引用中留下一个新错误。要解决此问题,请将外键表引用放在引号中。您可以通过引用声明性文档(例如。,声明性.py)在“配置关系”下,具体地说,阅读引用国外参考文献的部分。在

对于您的代码,这看起来像:

class ReportPhoto(Base):
    # This now goes first
    __tablename__ = 'report_photo'
    id = Column(Integer, primary_key=True)
    # Notice the quotations around Report references here
    report_id = Column(Integer, ForeignKey("Report.id"), nullable=False)

    # Notice the quotations around Report references here
    report = relationship("Report", 
           uselist=False, 
           backref=backref("report_photo", uselist=True))

class Report(Base):
    # This is now _after_ ReportPhoto
    __tablename__ = 'report'
    id = Column(Integer, primary_key=True)

    # ReportPhoto now exists and we will not trip a NameError exception
    has_photo = column_property(
        select(ReportPhoto.any())
    )

这样的事情应该会奏效:

    class ReportPhoto(Base):
        __tablename__ = 'report_photo'
        id = Column(Integer, primary_key=True)
        report_id = Column(Integer, ForeignKey('report.id'), nullable=False)

    class Report(Base):
        __tablename__ = 'report'
        id = Column(Integer, primary_key=True)
        report_photos = relationship(ReportPhoto, backref='report')
        has_photo = column_property(
            exists().where(ReportPhoto.report_id==id)
        )

相关问题 更多 >