Python 在sqlalchemy中查找平均日期

Python 在sqlalchemy中查找平均日期,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我有两张桌子。富和酒吧 class Foo(db.Model): id = db.Column(db.Integer, primary_key=True) bars = db.relationship('Bar', backref='foo', lazy='dynamic') class Bar(db.Model): id = db.Column(db.Integer, primary_key=True) date = db.Column(db.DateTime, defaul

我有两张桌子。富和酒吧

class Foo(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  bars = db.relationship('Bar', backref='foo', lazy='dynamic')

class Bar(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  date = db.Column(db.DateTime, default=datetime.utcnow)
  foo_id= db.Column(db.Integer, db.ForeignKey('foo.id'))
我怎样才能在Foo中拥有一个混合属性,它可以从所有条中找到平均日期。我已经尝试了以下方法,它不会产生任何错误,但不会给出期望的结果

@hybrid_property
  def baz(self):
    return db.select([db.func.avg(Bar.date)]) \
      .where(Bar.foo_id == self.id) \
      .label('baz')
我做错了什么?

这是个棘手的问题

我不确定在
DateTime
对象上应用
avg()。
如果我是你,我会以秒为单位计算此字段的平均值。
为此,您可以在
Bar
中使用
hybrid_属性
表达式
,将
日期
字段转换为秒:

class Bar(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  date = db.Column(db.DateTime)
  foo_id= db.Column(db.Integer, db.ForeignKey('foo.id'))

  @hybrid_property
  def date_seconds(self):
    return time.mktime(self.date.timetuple())

  @date_seconds.expression
  def date_seconds(cls):
    return time.mktime(cls.date.timetuple())

然后使用这个
date\u seconds
来计算秒数的平均值,并将其转换回可读的时间格式。

多亏了这个,我成功地解决了这个问题

自1970年1月1日以来,我创建了一个自定义类型,将日期时间存储为秒。(UTC)

并将此
date=db.Column(db.DateTime)
更改为此
date=db.Column(IntegerDate)

然后我可以得到平均值

@hybrid_property
  def baz(self):
    return db.select([db.func.avg(Bar.date)]) \
      .where(Bar.foo_id == self.id) \
      .label('baz')

这似乎是回答我问题的正确途径,但我得到了一个错误
TypeError:“NoneType”对象在此部分不可调用
cls.date.timetuple()
实际上,在尝试基于此方法的多个解决方案后,我得到了相同的错误,也许其他人可以帮助解决这个问题?很抱歉没有找到解决方案,但我确信我们走的是正确的道路。问题是,您无法在
date\u秒内将插入指令的属性
cls.date
视为Python日期对象。表达式
。应该使用它来形成合适的SQL表达式。
@hybrid_property
  def baz(self):
    return db.select([db.func.avg(Bar.date)]) \
      .where(Bar.foo_id == self.id) \
      .label('baz')