如何在带有条件if的sqlalchemy中使用条件运算符or_?
How to use conditional operator or_ in sqlalchemy with conditional if?
现有代码片段:
if sup_usr_only:
query_ob = query_ob.filter(
or_(
and_(
Department.id.in_(login_user.department_ids), # logic is OK - checked.
model.visibility == VISIBLE_DEPT
),
and_(
model.visibility == VISIBLE_COMPANY,
model.company_id == login_user.company_id
))
)
else:
query_ob = query_ob.filter(
or_(
and_(
Department.id.in_(login_user.department_ids), # logic is OK - checked.
model.visibility == VISIBLE_DEPT
),
model.visibility == VISIBLE_GLOBAL,
and_(
model.visibility == VISIBLE_COMPANY,
model.company_id == login_user.company_id
))
)
是否有一种方法可以通过 in line if check 或任何其他优化来最小化代码片段?
想要像下面这样(这在语法上是错误的):
query_ob = query_ob.filter(
or_(
and_(
Department.id.in_(login_user.department_ids),
model.visibility == VISIBLE_DEPT
),
model.visibility == VISIBLE_GLOBAL if not sup_usr_only,
and_(
model.visibility == VISIBLE_COMPANY,
model.company_id == login_user.company_id
))
)
您可以预先在列表中创建 or_
的参数,然后将它们应用于 or_()
函数:
options = [
and_(
Department.id.in_(login_user.department_ids),
model.visibility == VISIBLE_DEPT
),
and_(
model.visibility == VISIBLE_COMPANY,
model.company_id == login_user.company_id
)]
if not sup_usr_only:
options.append(model.visibility == VISIBLE_GLOBAL)
query_ob = query_ob.filter(or_(*options))
对于数据库来说,OR
语句中选项的排列顺序无关紧要,但如果您觉得顺序对您的应用程序很重要,您也可以使用 options.insert(1, model.visibility == VISIBLE_GLOBAL)
。
现有代码片段:
if sup_usr_only:
query_ob = query_ob.filter(
or_(
and_(
Department.id.in_(login_user.department_ids), # logic is OK - checked.
model.visibility == VISIBLE_DEPT
),
and_(
model.visibility == VISIBLE_COMPANY,
model.company_id == login_user.company_id
))
)
else:
query_ob = query_ob.filter(
or_(
and_(
Department.id.in_(login_user.department_ids), # logic is OK - checked.
model.visibility == VISIBLE_DEPT
),
model.visibility == VISIBLE_GLOBAL,
and_(
model.visibility == VISIBLE_COMPANY,
model.company_id == login_user.company_id
))
)
是否有一种方法可以通过 in line if check 或任何其他优化来最小化代码片段? 想要像下面这样(这在语法上是错误的):
query_ob = query_ob.filter(
or_(
and_(
Department.id.in_(login_user.department_ids),
model.visibility == VISIBLE_DEPT
),
model.visibility == VISIBLE_GLOBAL if not sup_usr_only,
and_(
model.visibility == VISIBLE_COMPANY,
model.company_id == login_user.company_id
))
)
您可以预先在列表中创建 or_
的参数,然后将它们应用于 or_()
函数:
options = [
and_(
Department.id.in_(login_user.department_ids),
model.visibility == VISIBLE_DEPT
),
and_(
model.visibility == VISIBLE_COMPANY,
model.company_id == login_user.company_id
)]
if not sup_usr_only:
options.append(model.visibility == VISIBLE_GLOBAL)
query_ob = query_ob.filter(or_(*options))
对于数据库来说,OR
语句中选项的排列顺序无关紧要,但如果您觉得顺序对您的应用程序很重要,您也可以使用 options.insert(1, model.visibility == VISIBLE_GLOBAL)
。