2016-04-25 19 views
4

既存のコードスニペット:sqlalchemyの条件演算子or_を条件付きで使用する方法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 
       )) 
     ) 

答えて

3

あなたは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)も使用できます。