2016-04-25 2 views
4

Существующий фрагмент кода:Как использовать условный оператор или_ в sqlalchemy с условным 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).

Смежные вопросы