SQLAlchemy列属性基础

7

我有两个模型:

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

我希望给Report模型添加一个列,用于指示ReportPhoto中是否有任何记录。我尝试使用column_property这种方式:

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

    has_photo = column_property(
        select(ReportPhoto.any())
    )

但是收到一个错误 NameError: name 'ReportPhoto' is not defined。我该如何解决这个问题?

2个回答

6
类似以下的代码应该可以工作:
    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)
        )

5
我将在@Vladimir lliev的回答上进行补充,以便于其他人更容易理解如何操作。
将具有“外键列属性”的表格放置在它所引用的表格之后。 在这种情况下,这意味着将Report放置在ReportPhoto之后。这样可以解决NameError错误,但您会遇到新的报告照片外键引用错误。要解决此问题,请将您的外键表格引用放在引号中。您可以通过参考声明文档(例如declarative.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())
    )

column_property 是访问已连接的 ReportPhoto 记录还是返回随机的 ReportPhoto 记录? - ChaimG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接