【问题标题】:Plone/Sqlalchemy (saconfig) - Using .filter of a session object, how can I filter on specific fields that were chosen by a user?Plone/Sqlalchemy (saconfig) - 使用会话对象的 .filter,我如何过滤用户选择的特定字段?
【发布时间】: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


【解决方案1】:

查看您的类,从searchAssets 方法中,您只需要访问self.request.form 类似dict 的对象并读取提交(通过HTTP GET 或POST)到该视图的所有数据。

然后您可以构建过滤器参数列表,例如:

params = []
if 'param1' in self.request.form:
    params.append(Asset_ID.like(...))
if ...

session.query(*params)

【讨论】:

  • 获取用户在字段中输入的数据后,我应该将什么传递给 session.query.filter 函数?就像在一种情况下 GPCL_Asset_ID 存在,但在另一种情况下只有模型存在?
  • 增强了问题(它更像是一个纯 Python/SQLAchemy 问题)。 SQLAlchemy 过滤器/查询总是返回您可以收集并稍后传递给方法的对象。
  • 非常感谢。这就是我一直在寻找的。另外,我以后会更加注意细节。
猜你喜欢
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2019-06-18
  • 2015-12-04
  • 2021-05-15
相关资源
最近更新 更多