【问题标题】:SQLAlchemy - accessing columns of child model through parent model (one-to-one relation)SQLAlchemy - 通过父模型访问子模型的列(一对一关系)
【发布时间】:2017-06-28 05:15:10
【问题描述】:

我有两个模型,它们之间是一对一的关系。我想访问ItemDataItem 的列(例如item = Item(); item.value)。我试图覆盖__getattr__,但这种方法被 SQLAlachemy 基础模型大量使用。任何帮助表示赞赏。

class Item(Model):
    __tablename__ = "item_data"
    id = Column(Integer, primary_key=True)

    data = relationship("ItemData", back_populates="_item", uselist=False,
                        foreign_keys="ItemData._item_id")

class ItemData(Model):
    __tablename__ = "items_data"
    id = Column(Integer, primary_key=True)

    _item_id = Column(Integer, ForeignKey("items.id"))
    _item = relationship("Item", back_populates="data",
                            foreign_keys=[_item_id])

    value = Column(Integer)

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    我通过编写应该应用于 Item 的类装饰器解决了这个问题。

    from sqlalchemy.ext.hybrid import hybrid_property
    
    def direct_data_getter(cls):
        '''Provide direct access to attributes of data.'''
        fields = set(cls.data_cls.__mapper__.columns.keys()) - set(dir(cls))
        for field in fields:
            method = hybrid_property(
                lambda self, field=field: getattr(self.data, field)
            )
            setattr(cls, field, method)
        return cls
    

    【讨论】:

      猜你喜欢
      • 2016-08-23
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 2014-04-02
      • 2014-05-15
      • 1970-01-01
      • 2016-04-17
      相关资源
      最近更新 更多