【问题标题】:What is the best practice for 'find' in the python repository pattern?在 python 存储库模式中“查找”的最佳实践是什么?
【发布时间】:2018-03-12 12:12:51
【问题描述】:

我正在使用 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才能完成会话查询。

有什么建议吗?

【问题讨论】:

    标签: python sqlalchemy repository-pattern


    【解决方案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')
    

    【讨论】:

    • 谢谢!这就是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多