sqlalchemy查询中的自定义方法

2024-10-03 02:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要的是从ShipProperties表中获取实体,并从ShipPropertiesVisibility表中提取信息,以获取简单实体can_seecan_edit,分别说明用户是否可以查看或编辑属性

基本上是这样的(我尝试使用同一模块中的python方法),但这在语法上不起作用:

def get_properties(ship_internal_id, user_id, company_id):
    ship_properties = db.session.query(ShipProperties, 
            _can_see(ShipPropertiesVisibility.visible 
                    if ShipPropertiesVisibility is not None else None) \
                .label("can_see"), 
            _can_edit(ShipAccess.view_only, ShipPropertiesVisibility.editable 
                    if ShipPropertiesVisibility is not None else None) \
                .label("can_edit"))
            ...
    return ship_properties

def _can_see(visible):
    return visible is None or visible is True

def _can_edit(ship_access_view_only, editable):
    return ship_access_view_only is False \
        and (editable is None or editable is True)

我还尝试了以下操作,因为我的_can_see_can_edit函数只是andor运算符的简单组合:

ship_properties = db.session.query(ShipProperties, 
        func.or_(ShipPropertiesVisibility.visible == None,
                ShipPropertiesVisibility.visible == True) \
            .label("can_see"), 
        func.and_(ShipAccess.view_only == False,
                or_(ShipPropertiesVisibility.editable == None,
                    ShipPropertiesVisibility.editable == True)) \
            .label("can_edit"))\
        ...

但由此我得到了以下错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "or"
LINE 1: ...groups, properties.private AS properties_private, or(ship_pr...

我还研究了hybrid properties and methods,但我认为这些将不起作用,因为ShipPropertiesVisibility实体可以是None(意味着该属性可以被用户查看和编辑),在这种情况下,我不相信我可以调用方法或属性。如果我错了,请纠正我

我是否接近解决方案,只是缺少正确的语法,或者这是一个思维上的严重错误,我更应该研究,例如,将sqlalchemy结果转换为视图模型,或者其他什么


Tags: ornoneviewtrueonlyispropertiesedit
1条回答
网友
1楼 · 发布于 2024-10-03 02:34:23

通过使用泛型.op()方法,我找到了一种使用布尔sql运算符的方法

ship_properties = db.session.query(ShipProperties, Properties, 
        ((ShipPropertiesVisibility.visible == None) \
            .op("OR")(ShipPropertiesVisibility.visible)) \
            .label("can_see"),
        (ShipAccess.view_only == False)
            .op("AND")((ShipPropertiesVisibility.editable == None) \
                .op("OR")(ShipPropertiesVisibility.editable)) \
            .label("can_edit"))\

相关问题 更多 >