title: SQLAlchemy - Writing a hybrid method for child count
body: <p>I'm using Flask-SQLAlchemy, and I'm trying to write a <a href="http://docs.sqlalchemy.org/en/rel_0_7/orm/extensions/hybrid.html">hybrid method</a> in a parent model that returns the number of children it has, so I can use it for filtering, sorting, etc. Here's some stripped down code of what I'm trying:</p>
  
  <pre><code># 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
  </code></pre>
  
  <p>I'm running into two problems here. For one, I don't know what exactly to return in the "child_count(cls)", which has to be an SQL expression... I think it should be something like</p>
  
  <pre><code>return select([func.count('*'), from_obj=Child).where(Child.parent_id==cls.parent_id).label('Child count')
  </code></pre>
  
  <p>but I'm not sure. Another issue I have is that I can't import the Child class from parent.py, so I couldn't use that code anyway. Is there any way to use a string for this? For example,</p>
  
  <pre><code>select([func.count('*'), from_obj='children').where('children.parent_id==parents.parent_id').label('Child count')
  </code></pre>
  
  <p>Eventually, I'll want to change the method to something like:</p>
  
  <pre><code>def child_count(cls, start_time, end_time):
      # return the number of children whose "date" parameter is between start_time and end_time
  </code></pre>
  
  <p>...but for now, I'm just trying to get this to work. Huge thanks to whoever can help me with this, as I've been trying to figure this out for a long time now.</p>