7

私は2つのモデルを持っています:

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 内にレコードがあることを示す列を Report モデルに追加したいと思います。私はこのように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。この問題を解決するにはどうすればよいですか?

4

2 に答える 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)
        )
于 2012-08-31T23:23:41.340 に答える
4

これを行う方法がわからない可能性がある他の人のために、@Vladimir llievの応答にいくつかの説明を追加します。

「外部テーブル参照」 column_property を持つテーブルを、それが参照するテーブルのに配置します。この場合、ReportPhoto の後に Report を配置することを意味します。これで NameError は解決されますが、ReportPhoto 外部キー参照に新しいエラーが残ることになります。これを解決するには、外部キー テーブル参照を引用符で囲みます。宣言型ドキュメント (declarative.py など) を参照し、"Configuring Relationships" の下を見ると、詳細を読むことができます。具体的には、外部参照の引用に関する部分を読んでください。

あなたのコードでは、これは次のようになります。

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())
    )
于 2014-01-06T04:57:06.683 に答える