如何在 sqlalchemy 中使用条件运算符 or_ 和条件 if?

M.A*_*nto 5 python optimization refactoring sqlalchemy

现有代码片段:

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
            ))
    )
Run Code Online (Sandbox Code Playgroud)

是否有一种方法可以通过内联 if 检查或任何其他优化来最小化代码片段?想要像下面这样(语法上错误):

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
                ))
        )
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 4

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))
Run Code Online (Sandbox Code Playgroud)

对于数据库来说,语句中选项列出的顺序并不重要OR,但如果您认为顺序对您的应用程序很重要,您options.insert(1, model.visibility == VISIBLE_GLOBAL)也可以使用。