【问题标题】:Cross reference while defining FK and children relationships SQLAlchemy定义 FK 和子关系时的交叉引用 SQLAlchemy
【发布时间】:2021-03-21 05:57:06
【问题描述】:
Class Bed
   id
Class Guest
    id
    bed_assignments = relationship(

          primaryjoin=(
              "and_(Guest.id"
              "==foreign(BedAssignment.guest_id),"
              "BedAssignment.bed_status=='occupied')"
         ),

)

Class BedAssignment
    FK Guest
    FK Bed

每个类都在一个文件中,并且为了 FK 目的引用 BedAssignment 类中的 Guest,然后为了关系目的引用 BedAssignment 会创建一个交叉引用。

我尝试使用 FK 或关系引用的文本版本,类似于: Column(Integer, ForeignKey("bed.id") 但这似乎是一种解决方法,因为它会停止生成错误寻找参考的 Alembic 脚本。

在这种关系模型的情况下如何解决交叉引用?

【问题讨论】:

  • 我的回答能解决你的担忧吗@Azuz ?

标签: python database sqlalchemy relationship alembic


【解决方案1】:

由于您的关系来自关联表 + 具有辅助连接规范,因此请按如下方式构建您的关系:

bed_assignments = relationship(
    "Bed", #class name of the table
    secondary = "BedAssignment", #table name of the association table
    # Consider using exact tablenames for your join statement...
    primaryjoin = """and_(
        Guest.id==BedAssignment.guest_id,
        BedAssignment.bed_status=='occupied'
    )""",
    backref=backref("Bed", lazy="dynamic"), # if you want the relationship to be observable on the other class... (Guests as children of Beds)
    lazy='dynamic', #only load as needed
    post_update=True, # this allows updating of dependent rows without collisions or cyclical dependencies 
    )

【讨论】:

  • 谢谢雅科夫!我需要在来宾中引用 BedAssignment 来解释关系类,反之亦然。我错过了这样一个事实,即我可以引用模型文件夹中 init.py 中的类,这使得我的问题在其他线程中得到了回答。
  • 很高兴听到这个消息。此外,backref 只需要声明一次关系。 @Azuz
  • 另外,如果它解决了你的问题,请考虑接受这个答案
猜你喜欢
  • 1970-01-01
  • 2019-04-29
  • 2011-01-21
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多