找到'的最佳做法是什么?在python存储库模式?

时间:2018-03-12 12:12:51

标签: python sqlalchemy repository-pattern

我正在使用SQLAlchemy编写一个带有存储库模式的python脚本。我定义的方法是添加,获取,更新,删除,查找。

考虑到我的模型中有多个字段:field1,field2,field3。制作一个能够让用户搜索多个字段的函数的最佳方法是什么?

现在,我所拥有的是:

def find_item(self, field1, field2, field3):
    return self.session.query(Model).filter(Model.field1 == field1, Model.field2 == field2, Model.field3 == field3).all()

但是当用户仅使用field1进行搜索时,它会给出错误,因为完成会话查询需要field2和field3。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

对于固定长度的3个参数,您可以使用

def find_item(self, field1=None, field2=None, field3=None):
    args = []
    if field1 is not None:
        args.append(Model.field1 == field1)
    if field2 is not None:
        args.append(Model.field2 == field2)
    if field3 is not None:
        args.append(Model.field3 == field3)

    return self.session.query(Model).filter(*args).all()

或者可变数量的参数

def find_item(self, **kwargs):
    args = [
      (getattr(Model, fieldname) == value) for fieldname, value in kwargs.iteritems()
    ]

    return self.session.query(Model).filter(*args).all()

两者都将被称为

something.find_item(field1='foo')