sqlalchemy中hybrid_属性中的嵌套关系

2024-07-03 07:51:35 发布

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

我有一个@hybrid_property,它引用了一个嵌套关系self.establishment_type.establishment_base_type.name == 'QSR'。它在assert location.is_qsr == True中的Location对象上工作,但在过滤器中不起作用。我试过添加一个@is_qsr.expression函数,但都不能使它们工作。如何启用诸如query(Location).filter(Location.is_qsr == True)之类的筛选器?在

class Location(Base):
    __tablename__ = 'houses'
    id = Column(Integer, primary_key=True)
    establishment_type_id = Column(
        Integer, ForeignKey('establishment_types.id')
    )
    establishment_type = relationship('EstablishmentType')

    @hybrid_property
    def is_qsr(self):
        if self.establishment_type:
            if self.establishment_type.establishment_base_type:
                return self.establishment_type.establishment_base_type.name == 'QSR'

        return False

class EstablishmentType(Base):
    __tablename__ = 'establishment_types'
    id = Column(Integer, primary_key=True)

    establishment_base_type_id = Column(
        Integer, ForeignKey('establishment_base_types.id')
    )
    establishment_base_type = relationship('EstablishmentBaseType')

class EstablishmentBaseType(Base):
    __tablename__ = 'establishment_base_types'
    id = Column(Integer, primary_key=True)

Tags: selfidtruebaseistypecolumnlocation
1条回答
网友
1楼 · 发布于 2024-07-03 07:51:35

您可以在关系上使用^{}

@is_qsr.expression
def is_qsr(cls):
    return cls.establishment_type.has(
        EstablishmentType.establishment_base_type.has(
            EstablishmentBaseType.name == "QSR"))

这并不能产生世界上最有效的查询(它执行EXISTS (SELECT 1 FROM ...)),但是一个像样的优化器应该能够解决这个问题。在

相关问题 更多 >