首页 > 解决方案 > 使用 sqlalchemy 和 marshmallow 求和

问题描述

我正在使用 python 的框架金字塔,用于数据的 sqlalchemy 和用于序列化的棉花糖。我想向客户发送一笔价值

我有挑战和使用这个挑战的玩家,玩家的每个动作都是一个事件,每个事件都有一个持续时间。

对于每个挑战,我想为每个玩家发送总和的持续时间,并且只为一个玩家发送这个值。我尝试使用混合属性或 pre_dump 函数但我没有成功

  1. 第一种方法:具有混合属性

    __tablename__ = "Challenge"
    id = Column(Integer, primary_key=True)
    name = Column(String(255), unique=True, nullable=False)
    description = Column(TEXT(length=65535))
    map_url = Column(String(255))
    end_date = Column(DateTime(timezone=False))
    alone_only = Column(Integer)
    level = Column(String(255))
    scalling = Column(Integer)
    draft = Column(Boolean, server_default=text("0"))
    admin_id = Column(Integer, ForeignKey("User.id"))
    admin = relationship("User", backref="challenge_manager")
    event_sum_user = relationship("Events")```
    
    @hybrid_property
    def event_sum(self):
         return sum(Events.duration for Events in self.event_sum_user)
    
    

但我有所有用户的总和,而不是用户或一个用户的总和

  1. 第二种方法:使用 pre_dump 方法

    id = fields.Int()
    name = fields.Str()
    description = fields.Str()
    end_date = fields.DateTime()
    alone_only = fields.Int()
    level = fields.Str()
    scalling = fields.Int()
    draft = fields.Bool()
    admin = fields.Nested(UserSchema)
    admin_id = fields.Int(load_only=True)
    event_sum = fields.Int(dump_only=True)  
    
    @pre_dump
    def get_eventsum(self,data, **kwargs):
        data["event_sum"] = DBSession.query(func.sum(Events.duration)).filter(Events.challenge_id==data["id"]).filter(Events.user_id==1).first()
        return data```
    

使用这种方法,我有一个错误 TypeError: 'Challenge' object is not subscriptable'

这样做的目的是发送每个挑战的总持续时间,由用户或挑战中的每个用户实现:id_user 和总持续时间。

谢谢你的帮助

玛丽莲

标签: python-3.xsqlalchemymarshmallow-sqlalchemy

解决方案


推荐阅读