Python Plone/Sqlalchemy(saconfig)-使用会话对象的.filter,如何筛选用户选择的特定字段?
我已经通过使用saconfig和声明性base将接口中定义的字段映射到mysql后端数据库。*在我的Plone站点实例上,我有一个表单(z3c.form)将使用这些字段,并将用于根据几个字段中输入的条件从mysql数据库中搜索“资产”。在我的例子中,我只想查询输入了数据的字段 这就是我的界面和ORMBase类的外观:Python Plone/Sqlalchemy(saconfig)-使用会话对象的.filter,如何筛选用户选择的特定字段?,python,sqlalchemy,plone,Python,Sqlalchemy,Plone,我已经通过使用saconfig和声明性base将接口中定义的字段映射到mysql后端数据库。*在我的Plone站点实例上,我有一个表单(z3c.form)将使用这些字段,并将用于根据几个字段中输入的条件从mysql数据库中搜索“资产”。在我的例子中,我只想查询输入了数据的字段 这就是我的界面和ORMBase类的外观: class IAsset(Interface): """Interface class of an asset """ Asset_ID = schema
class IAsset(Interface):
"""Interface class of an asset
"""
Asset_ID = schema.Int(title=u"Asset ID",
required=False
)
GPCL_Asset_ID = schema.TextLine(title=u"GPCL Asset Tracker",
required=False
)
Asset_Type = schema.Int(title=u"Asset Type",
required=False
)
Manufacturer = schema.Int(title=u"Manufacturer",
required=True
)
Model = schema.TextLine(title=u"Serial Number",
required=False
)
Serial_Number = schema.TextLine(title=u"Serial Number",
required=False
)
class Asset(ORMBase):
"""Class for asset
"""
__tablename__ = 'Assets'
Asset_ID = sqlalchemy.Column(sqlalchemy.Integer(),
primary_key=True,
autoincrement=True
)
GPCL_Asset_ID = sqlalchemy.Column(sqlalchemy.String(255),
nullable=True
)
Asset_Type = sqlalchemy.Column(sqlalchemy.Integer(),
nullable=False
)
Manufacturer = sqlalchemy.Column(sqlalchemy.Integer(),
nullable=False
)
Model = sqlalchemy.Column(sqlalchemy.String(255),
nullable=True
)
Serial_Number = sqlalchemy.Column(sqlalchemy.String(255),
nullable=True
)
出于测试目的,我正在使用资产的视图类,并且我有一个函数(出于测试目的通过模板调用current),该函数基于填写的字段构建字典。我还有一个名为AssetUtils的实用程序类,在名为queryAssets的类中有一个函数,它接受包含条件的字典,并返回找到的搜索结果
class View(grok.View):
"""View class
"""
...grok definitions and fields being set for form
def searchAssets(self):
#get data
....
criteria = {}
#build dictionary
#if field (i.e. GPCL_Asset_ID) is not empty, add to the dictionary GPCL_Asset_ID:valueEnteredByUser
assets = queryAssets(criteria)
class AssetUtils(grok.GlobalUtility):
def queryAssets(searchCriteria):
我在类的根目录下定义了一个会话对象。在queryAssets中,我想使用session.query(Asset.filter()来查询Assets表。不过,我遇到的问题是弄清楚要传递到filter()中的内容。我知道如何使用查询函数,比如session.query(Asset.filter)(GPCL_Asset_ID.like('D%”),Manufacturer==15)。
但是,假设序列号存在,但GPCL_资产_ID不存在,所以我想使用.filter(序列号类似(“EX12%”),然后是另一种情况,其中只有型号和制造商存在。过滤器(类似型号(“A3%”,制造商==32)
因此,我的问题是,如何使字典中定义/选择的字段上的.filter过滤器传递到我拥有的queryAssets函数中,而不是.filter函数中预定义的字段
*我跟随Martin Aspeli的《专业Plone 4开发》一书,第12章和幻灯片演示()-幻灯片27、29。与幻灯片相比,我实际上使用的是Martin Aspeli书中的saconfig。查看您的类,从
searchAssets
方法,您只需访问self.request.form
dict-like对象并读取提交给该视图的所有数据(通过HTTP GET或POST)
然后,您可以构建过滤器参数列表,如:
params = []
if 'param1' in self.request.form:
params.append(Asset_ID.like(...))
if ...
session.query(*params)
不清楚阅读您的问题:您是否已经使用您喜欢的HTML表单创建了视图(使用普通ZPT或z3c.form或其他)?你能用关于表格的附加信息来强化这个问题吗?我试图重写这个问题以使它更清楚。很抱歉,我的问题的详细信息以前很混乱/杂乱无章。此外,我目前正在调用资产视图模板中的函数searchAssets,以进行测试。因此,我正在尝试各种场景,例如assets=queryAssets({GPCL_Asset_ID:'D231'}),这将导致results=session.query(GPCL_Asset_ID.like(“D231%”))一旦获得用户输入字段的数据,我应该向session.query.filter函数传递什么?例如,如果在一种情况下存在GPCL_资产_ID,但在另一种情况下仅存在模型,则增强了问题(这更纯粹是Python/SQLAchemy的问题)。SQLAlchemy筛选器/查询始终返回您可以收集并稍后传递给方法的对象。非常感谢。这就是我要找的。另外,我以后会更加注意细节。