私はFlask-SQLAlchemyを使用しており、親モデルで子の数を返すハイブリッドメソッドを作成しようとしているので、フィルタリングや並べ替えなどに使用できます。私はしようとしています:
# parent.py
from program.extensions import db
from sqlalchemy.ext.hybrid import hybrid_method
class Parent(db.Model):
__tablename__ = 'parents'
parent_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
children = db.relationship('Child', backref='parent', lazy='dynamic')
def __init__(self, name):
self.name = name
@hybrid_method
def child_count(self):
return self.children.count()
@child_count.expression
def child_count(cls):
return ?????
# child.py
from program.extensions import db
from program.models import Parent
class Child(db.Model):
__tablename__ = 'children'
child_id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey(Parent.parent_id))
name = db.Column(db.String(80))
time = db.Column(db.DateTime)
def __init__(self, name, time):
self.name = name
self.time = time
ここで2つの問題が発生しています。1つは、SQL式である必要がある「child_count(cls)」で正確に何を返すかわからない...次のようなものである必要があると思います
return select([func.count('*'), from_obj=Child).where(Child.parent_id==cls.parent_id).label('Child count')
確信はないけど。私が抱えているもう1つの問題は、parent.pyからChildクラスをインポートできないため、とにかくそのコードを使用できなかったことです。これに文字列を使用する方法はありますか?例えば、
select([func.count('*'), from_obj='children').where('children.parent_id==parents.parent_id').label('Child count')
最終的には、メソッドを次のようなものに変更したいと思います。
def child_count(cls, start_time, end_time):
# return the number of children whose "date" parameter is between start_time and end_time
...しかし今のところ、私はこれを機能させようとしています。私は長い間これを理解しようとしてきたので、これを手伝ってくれる人に大いに感謝します。