您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 如何编写依赖于子关系中的列的混合属性?

5b51 2022/1/14 8:23:34 python 字数 2610 阅读 613 来源 www.jb51.cc/python

假设父母和孩子有两张桌子(使用SQLAlchemy):class Child(Base): __tablename__ = 'Child' id = Column(Integer, primary_key=True) is_boy = Column(Boolean, default=False) parent_id

概述

假设父母和孩子有两张桌子(使用sqlAlchemy):

class Child(Base):
     __tablename__ = 'Child'
     id = Column(Integer,primary_key=True) 
     is_boy = Column(Boolean,default=False)
     parent_id = Column(Integer,ForeignKey('Parent.id'))


class Parent(Base):
     __tablename__ = 'Parent'
     id = Column(Integer,primary_key=True) 
     children = relationship("Child",backref="parent")

如何查询房产是否父母是否有孩子?希望在pandas中使用此列但不确定如何有效地查询它.我的直觉是创建一个sqlALchemy混合属性has_a_boy_child,但我不确定如何定义混合属性或匹配表达式.谢谢!

@hybrid_property
def has_a_boy_child(self):
    return any(child.is_boy for child in self.children)

@has_a_boy_child.expression
def has_a_boy_child(cls):
    return (
        select([func.count(Child.id)])
        .where(Child.parent_id == cls.id)
        .where(Child.is_boy == True)
        .label("number_of_boy_children")
    )

你可以使用它:

q_has_boys = session.query(Parent).filter(Parent.has_a_boy_child).all()
q_no_boys = session.query(Parent).filter(~Parent.has_a_boy_child).all()
q_attr = session.query(Parent,Parent.has_a_boy_child).all()

更新:如果你真的想要一个bool而不是count(其中None在大熊猫中是na),你可以这样做,如下所示:

@has_a_boy_child.expression
def has_a_boy_child(cls):
    return (
        select([
            case([(exists().where(and_(
                Child.parent_id == cls.id,Child.is_boy == True,)).correlate(cls),True)],else_=False,).label("has_boys")
        ])
        .label("number_of_boy_children")
    )

总结

以上是编程之家为你收集整理的python – 如何编写依赖于子关系中的列的混合属性?全部内容,希望文章能够帮你解决python – 如何编写依赖于子关系中的列的混合属性?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶