python - 使用** kwargs构造方法参数?

时间:2015-01-02 02:57:13

标签: python sqlalchemy

我试图在我的类中创建一个方法,它允许我使用任意大小的列集来过滤sqlachemy查询的结果。类似的东西:

def Find(self, **kwargs):

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

但是,.filter()方法需要格式为table_name.column_name == value的参数。在这种情况下,表名始终是固定的,并且我将column_name / value作为kwargs字典中的键/值对传递。

我有没有办法在Find()方法中操纵通过的字典,以正确的格式输入filter()的参数?

2 个答案:

答案 0 :(得分:1)

filter()实际上需要位置参数。 table_name.column_name == value 表达式返回一个对象(由于sqlalchemy的__eq__方法重载),它表示相等条件,然后传递给filter()而没有关键字参数名称(请注意在您正常传递的参数中缺少任何 =

因此,您可以使用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, ...)

答案 1 :(得分:0)

SQLAlchemy的查询对象已经有一个filter_by()方法,该方法接受关键字参数,将列名映射到它们必须等于的值。