Sqlalchemy 混合炼金术

Sqlalchemy 混合炼金术,sqlalchemy,hybrid,Sqlalchemy,Hybrid,我有一个sqlalchemy(实际上是sqlalchemy,因此所有的db.*),我希望能够通过它们的平均投票对我的“事物”进行排序。它们相关的“投票”的值。投票的值为0到100 遇到sqlalchemy希望将average_vote_value@属性转换为sql的问题后,我发现我可能应该使用: 然而,我就是不知道在这种情况下是如何做到的。有人能帮忙吗 class Thing(db.Model): id = db.Column(db.Integer, primary_key=True)

我有一个sqlalchemy(实际上是sqlalchemy,因此所有的db.*),我希望能够通过它们的平均投票对我的“事物”进行排序。它们相关的“投票”的值。投票的值为0到100

遇到sqlalchemy希望将average_vote_value@属性转换为sql的问题后,我发现我可能应该使用:

然而,我就是不知道在这种情况下是如何做到的。有人能帮忙吗

class Thing(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    votes = db.relationship('Vote', backref='thing', lazy='dynamic')

    @hybrid_property
    def average_vote_value(self):
        '''average of vote.values'''
        values = [v.value for v in self.votes]
        try:
            return sum(scores) / len(values)
        except ZeroDivisionError:
            return 50 # the default value

    average_vote_value.expression
    def average_vote_value(cls):
        pass ### help ###


class Vote(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    thing_id = db.Column(db.Integer, db.ForeignKey('thing.id'))
    value = db.Column(db.Float, default=50.0)

在最后一天,您需要考虑如何获得SQL查询所需的结果。您不能仅从“混合、python、属性”等方面来考虑它。虽然我们将使用这些技术来获得结果,但正是SQL的工作方式将我们引导到了这一点。所以让我们使用Postgresql,它内置了AVG函数,大多数数据库都有。我们需要从一个事物到另一个投票,因为你要考虑没有投票权的情况,一个左外连接。混合表达式只是您想要的SQL表达式的语法助手,但在一天结束时,您仍然需要详细说明SQL需要的连接:

从sqlalchemy导入*
从sqlalchemy.orm导入*
从sqlalchemy.ext.hybrid导入hybrid_属性
从sqlalchemy.ext.declarative导入声明性基础
Base=声明性_Base()
类事物(基本):
__tablename_uuu='thing'
id=列(整数,主键=True)
名称=列(字符串(80))
投票=关系('Vote',backref='thing',lazy='dynamic')
@杂化性
def平均投票值(自身):
“投票平均值”
values=[v.value for v in self.voces]
尝试:
返回和(值)/长度(值)
除零误差外:
返回50#默认值
@平均投票值表达式
def平均投票值(cls):
返回函数合并(函数平均值,50)
集体投票(基数):
__tablename_uuu=‘投票’
id=列(整数,主键=True)
thing\u id=列(整数,ForeignKey('thing.id'))
值=列(浮动,默认值=50.0)
e=创建引擎(“postgresql://scott:tiger@本地主机/测试”,echo=True)
Base.metadata.drop_all(e)
Base.metadata.create_all(e)
s=会话(e)
s、 全部加起来([
事物(name=“thing1”,投票=[
投票(价值=5),
投票(价值=7),
投票(价值=7),
投票(数值=8),
投票(数值=8),
投票(价值=12),
投票权(价值=2),
投票(价值=15),
投票(价值=10),
]),
事物(name=“thing2”,投票=[
投票(价值=18),
投票(价值=16),
投票(价值=27),
投票(价值=6),
投票(价值=10),
]),
事物(name=“thing3”,投票=[])
]
)
s、 提交()
打印s.query(Thing.name、Thing.average\u vote\u value)\
外层(东西、票数)\
分组人(Thing.name).all()
输出(减去回波):

[(u'thing3', 50.0), (u'thing1', 8.22222222222222), (u'thing2', 15.4)]