代码之家  ›  专栏  ›  技术社区  ›  Sameer

简化Flask SqlAlchemy查询周围的一对if-else语句

  •  1
  • Sameer  · 技术社区  · 7 年前

    我的问题:

           if current_user['idx'] == 1:
                groups = sess.query(
                Role
                ).filter(
                    ~Role.name.in_(codes.group1) # filtering
                ).order_by(
                    Role.name
                )
            else:
                groups = sess.query(
                Role
                ).filter(
                    ~Role.name.in_(codes.group2) # filtering
                ).order_by(
                    Role.name
                )
    

    我的代码文件:

    group1= ['User']
    group2 = ['Admin', 'User']
    

    在上面的查询中,我正在筛选 codes.group1 if -声明和 codes.group2 else . 由于代码的查询部分看起来是重复的,是否有任何方法可以使代码更可读、更干净而不重复?

    2 回复  |  直到 7 年前
        1
  •  3
  •   thebjorn    7 年前

    由于查询几乎相同,您可以执行以下操作:

    normal_user = current_user['idx'] == 1
    groups = sess.query(
        Role
    ).filter(
        ~Role.name.in_(codes.group1 if normal_user else codes.group2)
    ).order_by(
        Role.name
    )
    

    group = codes.group1 if current_user['idx'] == 1 else codes.group2
    groups = sess.query(
        Role
    ).filter(
        ~Role.name.in_(group)
    ).order_by(
        Role.name
    )
    
        2
  •  2
  •   snakecharmerb    7 年前

    您可以增量构建查询,如下所示:

    groups = sess.query(Role)
    
    if current_user['idx'] == 1:
        groups = groups.filter(~Role.name.in_(codes.group1))
    else:
        groups = groups.filter(~Role.name.in_(codes.group2))
    
    groups = groups.order_by(Role.name)