Я хочу получить сущности из таблицы 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...
Я также искал гибридные свойства и методы , но я не думаю, что они будут работать, поскольку объект ShipPropertiesVisibility может иметь значение None (что означает, что свойство может быть как видимым, так и редактируемым пользователем), и в этом случае я не верю, что смогу вызвать метод или свойство. Поправьте меня, если я ошибаюсь.
Я близок к решению и просто пропускаю правильный синтаксис, или это серьезная ошибка в мышлении, и мне лучше посмотреть, например, на преобразование результата sqlalchemy в представление модель, или еще что?