2015-01-02 4 views
0

Я пытаюсь создать метод в моем классе, который позволит мне использовать произвольный размер столбцов для фильтрации результатов запроса sqlachemy. Что-то вроде:python - построить аргументы метода с использованием ** kwargs?

def Find(self, **kwargs): 

    f = self.db_session.filter(kwargs).first() 

Однако метод .filter() требует аргументов в формате table_name.column_name == value. В этом случае имя таблицы всегда фиксировано, и я передаю значение column_name/value в качестве пары ключ/значение в словаре kwargs.

Есть ли способ, которым я не вижу, чтобы манипулировать словарем, прошедшим через метод Find(), ввести аргументы в filter() в правильном формате?

ответ

1

filter() фактически принимает позиционные аргументы. table_name.column_name == valueвыражение возвращает объект (из-за перегрузки метода __eq__ по SQLAlchemy), который представляет собой условие равенства, а затем передается filter() без ключевого слова имени аргумента (обратите внимание на отсутствие каких-либо одного= в параметрах вы 'd проходить нормально).

Таким образом, вы можете использовать Find(self, *args), а затем вызвать .filter(*args), и вы будете иметь возможность ссылаться Find только как бы вызвать filter().

def Find(self, **kwargs): 
    f = self.db_session.filter(kwargs).first() 
    #... 


# invoke as foo.Find(table_name.column_name == value, ...) 
0

объекта запрос SQLAlchemy уже имеет filter_by() метод, который принимает аргументы ключевых слов, имена столбцов для значений, которые они должны быть равны.

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