首页 > 解决方案 > Flask Sqlalchemy ORM如何添加属性以返回子项的计数

问题描述

这一直让我发疯,我相信它比我做的更直接。但到目前为止,没有尽头的搜索和尝试各种组合,并没有让我到任何地方。

我正在使用 Flask 和 SQLAlchemy,而且我都是新手。所以,如果我有两个这样定义的类/表

class Child(db.Modal):
    __tablename__ = 'children'
    id = db.Column(db.Integer, primary_key=True)
    kidsname = db.Column(db.String(20))
    parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'), nullable=False)

class Parent(db.Model):
    __tablename__ = 'parent'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))
    children = db.relationship('Child', backref='parent', lazy=True)

我想要的是能够向父类添加一个属性以返回子类的数量,例如

def child_count(self):
    return ????

当父实例传递给我的html模板时,我希望能够做这样的事情。

<p>Parent: {{ parent.name }}  # of children: {{parent.child_count}}</p>

任何正确方向的帮助或指示将不胜感激。

标签: pythonflask-sqlalchemy

解决方案


您可以使用column_property https://docs.sqlalchemy.org/en/latest/orm/mapped_sql_expr.html

from sqlalchemy.orm import column_property
from sqlalchemy import select, func


class Parent(db.Model):
    __tablename__ = 'parent'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))
    children = db.relationship('Child', backref='parent', lazy=True)
    child_count = column_property(select([func.count(children.id)]).\
        where(children.parent_id==id))

此外,您可以在此问题SQLAlchemy - Writing a hybrid method for child count中找到有关 hybrid_property 问题的解决方案


推荐阅读