首页 > 解决方案 > 从 AbstractConcreteBase 继承时对混合属性进行多态过滤

问题描述

我已经成功地通过AbstractConcreteBase父级多态加载项目。是否也可以过滤后代的hybrid_property定义?我还想过滤每个子类的不同列。

查询

    # Fetching all ItemA and ItemB works well with...
    ItemBase.query.all()

    # Given the models below is it possible to filter on the children's
    # item_id hybrid_property to fetch all ItemB with item_b_id of 1
    # Result is []
    ItemBase.query.filter(ItemBase.item_id == 'B1')

    # This also doesn't work
    # Result is everything unfiltered
    ItemBase.query.filter(ItemB.item_id == 'B1')

楷模:

from sqlalchemy.sql.expression import cast
from sqlalchemy.ext.declarative import AbstractConcreteBase
from sqlalchemy.ext.hybrid import hybrid_property

class ItemBase(AbstractConcreteBase, Base):
    __tablename__ = None

    @hybrid_property
    def item_id(self): pass

    @activity_id.expression
    def item_id(cls):
       pass

class ItemA(ItemBase):
    __tablename__ = 'item_a'

    __mapper_args__ = {
        'polymorphic_identity': 'item_a',
        'concrete':True
    }

    item_a_id = db.Column(db.Integer, primary_key=True)

    @hybrid_property
    def item_id(self):
        return 'A' + str(self.item_a_id)

    @activity_id.expression
    def item_id(cls): 
        return 'A' + str(self.item_a_id)

class ItemB(ItemBase):
    __tablename__ = 'item_b'

    __mapper_args__ = {
        'polymorphic_identity': 'item_b',
        'concrete':True
    }

    item_b_id = db.Column(db.Integer, primary_key=True)

    @hybrid_property
    def item_id(self):
        return 'B' + str(self.item_b_id)

    @activity_id.expression
    def item_id(cls): 
        return 'B' + str(self.item_b_id)

我现在坚持使用表结构。任何帮助是极大的赞赏。

标签: sqlalchemy

解决方案


推荐阅读