SQLAlchemy自参考表获取孙子的数量

SQLAlchemy自参考表获取孙子的数量,sqlalchemy,Sqlalchemy,我有一个用户模型,每个用户都有另一个用户作为父用户。现在,为了获得子对象(属于给定模型实例的用户)的数量,我定义了以下属性: class User( object ): @property def childsCount( self ): return object_session(self).scalar( select([func.count(User.users_id)]).where(User.parent_id==self.us

我有一个用户模型,每个用户都有另一个用户作为父用户。现在,为了获得子对象(属于给定模型实例的用户)的数量,我定义了以下属性:

class User( object ):

    @property
    def childsCount( self ):
        return object_session(self).scalar(
            select([func.count(User.users_id)]).where(User.parent_id==self.users_id)
        )
…这行得通。我不知道的是我怎么知道孙子的数量?甚至是孙子孙女

有什么想法吗?

用于编写更深层次的
WHERE
子句。事实上,您可以做得更一般一些:

@property
def childrenCount(self):
    return self.count_children(0)

@property
def grandchildrenCount(self):
    return self.count_children(1)

@property
def grandgrandchildrenCount(self):
    return self.count_children(2)

def count_children(self, level=0):
    a = [aliased(User) for _ in range(level + 1)]
    qry = select([func.count(a[0].users_id)]).where(a[-1].parent_id==self.users_id)
    # insert all the intermediate JOINs
    for _i in range(level):
        qry = qry.where(a[_i].parent_id == a[_i+1].users_id)
    return Session.object_session(self).scalar(qry)
虽然它看起来有点神秘,但它真正的作用如下所示(为每个更深层次添加一个
alias
where
子句):


仅对于第一级,您实际上可以通过以下方式获得更好的查询:


老兄,我对sqlalchemy和python还是新手,但这已经是中文了。我会尽力消化它。顺便说一句,它的工作!谢谢。@Romeo:
解密了一些代码,以便于理解
@property
def children1Count(self):
    a0 = aliased(User)
    qry = select([func.count(a0.users_id)]).where(a0.parent_id==self.users_id)
    return Session.object_session(self).scalar(qry)

@property
def children2Count(self):
    a0 = aliased(User)
    a1 = aliased(User)
    qry = select([func.count(a0.users_id)]).where(a0.parent_id==a1.users_id).where(a1.parent_id==self.users_id)
    return Session.object_session(self).scalar(qry)

@property
def children3Count(self):
    a0 = aliased(User)
    a1 = aliased(User)
    a2 = aliased(User)
    qry = select([func.count(a0.users_id)]).where(a0.parent_id==a1.users_id).where(a1.parent_id==a2.users_id).where(a2.parent_id==self.users_id)
    return Session.object_session(self).scalar(qry)
@property
def childrenCount(self):
    return Session.object_session(self).query(User).with_parent(self).count()