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