docs: def order_expr(cls_or_alias, *columns):
          """
          Forms expressions like [desc(User.first_name), asc(User.phone)]
            from list like ['-first_name', 'phone']
  
          Example for 1 column:
            db.query(User).order_by(*User.order_expr('-first_name'))
            # will compile to ORDER BY user.first_name DESC
  
          Example for multiple columns:
            columns = ['-first_name', 'phone']
            db.query(User).order_by(*User.order_expr(*columns))
            # will compile to ORDER BY user.first_name DESC, user.phone ASC
  
          About cls_or_alias, mapper, cls: read in filter_expr method description
          """
          if isinstance(cls_or_alias, AliasedClass):
              mapper, cls = cls_or_alias, inspect(cls_or_alias).mapper.class_
          else:
              mapper = cls = cls_or_alias
  
          expressions = []
          for attr in columns:
              fn, attr = (desc, attr[1:]) if attr.startswith(DESC_PREFIX) \
                          else (asc, attr)
              if attr not in cls.sortable_attributes:
                  raise KeyError('Cant order {} by {}'.format(cls, attr))
  
              expr = fn(getattr(mapper, attr))
              expressions.append(expr)
          return expressions