2017-08-01 2 views
0

フラスコのsqlalchemyクエリを文字列でフィルタリングしようとしています。次の配列内の文字列の結果を作成するための私の手順は:フラスコsqlalchemyフィルタをテキスト配列を使用して

["user.name == 'Sid'", "user.role == 'admin'"] 

それは、このようなもので形成されます:

ここ
for i in myarray: 
    filter_string = "%s.%s == '%s'" % (self.model.__tablename__, i[0], i[2]) 
    or_filters.append(filter_string) 

がどのように私はそれを使用しています:

db = SQLAlchemy(app) 
... 
class myclass: 
    def __init(self, model): 
    self.model = model 
    self.q = db.session.query(self.model) 

    def get(self, cfg): 
    ... 
    # the following line works 
    myfilter = [User.name == 'Sid', User.role == 'admin'] 
    # the following line does not work, but I need it to. How to modify into the line above? 
    myfilter = ["user.name == 'Sid'", "user.role == 'admin'"] 
    if myfilter is not None: 
     self.q = self.apply_filter(myfilter) 

    items = self.q.all() 
    return items 

    def apply_filter(self, ftr): 
    self.q.filter(or_(*ftr)) 
+0

可能なduplic ate of [sql alchemyフィルタのstring変数からカラム名を動的に与える方法は?](https://stackoverflow.com/questions/10251724/how-to-give-column-name-dynamically-from-string-variable-in -sql-alchemy-filter) –

+2

これは[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)です。あなたはモデルがあり、あなたは希望する属性名を持っています。 'or_filters.append(getattr(self.model、i [0])== i [2])'を使ってください。 –

答えて

0

Iljaは良い解決策を持っていた

myfilter = getattr(self.model, i[0]).is_(i[2]) 
if myfilter is not None: 
    self.q = self.apply_filter(myfilter) 
関連する問題