我想要的是从ShipProperties表中获取实体,并从ShipPropertiesVisibility表中提取信息,以获取简单实体can_see
和can_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
函数只是and
和or
运算符的简单组合:
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结果转换为视图模型,或者其他什么
通过使用泛型
.op()
方法,我找到了一种使用布尔sql运算符的方法相关问题 更多 >
编程相关推荐