Python Plone/Sqlalchemy(saconfig)-使用会话对象的.filter,如何筛选用户选择的特定字段?

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

我已经通过使用saconfig和声明性base将接口中定义的字段映射到mysql后端数据库。*在我的Plone站点实例上,我有一个表单(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
                                     )
出于测试目的,我正在使用资产的视图类,并且我有一个函数(出于测试目的通过模板调用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筛选器/查询始终返回您可以收集并稍后传递给方法的对象。非常感谢。这就是我要找的。另外,我以后会更加注意细节。