Flask Sqlalchemy ORM, как добавить свойство, чтобы вернуть количество детей - PullRequest
0 голосов
/ 09 декабря 2018

Это сводит меня с ума, и я уверен, что это более прямолинейно, чем я это делаю.Но до сих пор без конца поиск и пробование различных комбинаций не смогли меня нигде получить.

Я использую 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>

Любая помощь или указатель в правильном направлении будет принята с благодарностью ..

1 Ответ

0 голосов
/ 09 декабря 2018

Вы можете использовать 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))

Также вы можете найти решение вашей проблемы с hybrid_property в этом вопросе SQLAlchemy - Написание гибридного метода для подсчета детей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...