【发布时间】:2014-10-13 17:57:45
【问题描述】:
我已经通过使用 saconfig 和声明性基础将接口中定义的字段映射到 mysql 后端数据库。* 在我的 Plone Site 实例上,我有一个表单 (z3c.form) 将使用这些字段并将用于根据在多个字段中输入的条件从 mysql 数据库中搜索“资产”。就我而言,我只想查询已输入数据的字段。
这是我的接口和 ORMBase 类的样子:
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
)
出于测试目的,我正在使用资产的视图类,并且我有一个函数(当前通过模板调用以进行测试),它根据填写的字段构建字典。我还有一个名为 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_Asset_ID,所以我想使用 .filter(Serial_Number.like("EX12%")),然后是另一种只有型号和制造商存在的情况。 .filter(Model.like("A3%"),Manufacturer==32)
所以我的问题是,我怎样才能使 .filter 过滤在字典中定义/选择的字段传递到我拥有的 queryAssets 函数,而不是在 .filter 函数中预定义的字段?
*我正在关注 Martin Aspeli 的“Professional Plone 4 Development”一书,第 12 章和幻灯片演示 (http://www.slideshare.net/jbellis/pycon-2010-sqlalchemy-tutorial) - Slide 27, 29。与幻灯片相比,我实际上使用的是 saconfig在 Martin Aspeli 的书中。
【问题讨论】:
-
不清楚您的问题:您是否已经使用您喜欢的 HTML 表单创建了一个视图(使用纯 ZPT 或 z3c.form 或其他)?您能否通过有关表单的其他信息来增强问题?
-
我试图重写问题以使其更清晰。抱歉,我的问题的详细信息之前令人困惑/杂乱无章。
-
另外,我目前正在资产的视图模板中调用函数 searchAssets 以进行测试。所以我正在尝试各种场景,例如 assets = queryAssets({GPCL_Asset_ID:'D231'}),这会导致 results = session.query(GPCL_Asset_ID.like("D231%"))
标签: python sqlalchemy plone