首页 > 解决方案 > 在 sqlalchemy 中查找平均日期

问题描述

我有两张桌子。Foo 和酒吧。

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')

我究竟做错了什么?

标签: pythonsqlalchemyflask-sqlalchemy

解决方案


这是一个棘手的问题。

我不确定应用avg()在一个DateTime对象上效果很好。如果我是你,我会以秒为单位计算该字段的平均值。为此,您可以hybrid_property使用一个expressioninBardate字段转换为秒:

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_seconds来计算秒的平均值,并将其转换回可读的时间格式。


推荐阅读