簡體   English   中英

如何在sqlalchemy中使用條件運算符or_ with conditional if?

[英]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
            ))
    )

如果有檢查或任何其他優化,我可以通過一種方式最小化代碼片段嗎? 想要在下面做這個(這在語法上是錯誤的):

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_的參數,然后將它們應用於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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM