python 存储库模式中 'find' 的最佳实践是什么?
What is the best practice for 'find' in the python 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来完成会话查询。
有什么建议吗?
对于你定长的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')
我正在使用 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来完成会话查询。
有什么建议吗?
对于你定长的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')