【问题标题】:How to make the argument to filter() a variable?如何使 filter() 的参数成为变量?
【发布时间】:2011-01-28 14:12:52
【问题描述】:

我有这个模型

class Item(db.Model):
    ...   
    glam = db.StringProperty()
    casual = db.StringProperty()
    speaking = db.StringProperty()

这个处理程序带有一个带有单选按钮的表单:

class SortForm(webapp.RequestHandler):
    def get(self):
        self.response.out.write("""
            <form name="submit_form" action="/sortformhandler" method="post">
            Category: <input type="radio" name="image" value="image"> Image <br />
            Sorty by tag: <br />
            <input type="radio" name="tag" value="glam" /> Glam <br />
            <input type="radio" name="tag" value="formal" /> Formal <br />
            <input type="radio" name="tag" value="speaking" /> Speaking <br />
            <input type="submit" value="submit">
            </form>
            """)

还有这个处理程序

class SortFormHandler(webapp.RequestHandler):
    def post(self):

        query = Item.all()

        query.filter("glam =", "glam")
                for item in query:
            self.response.out.write("""<a href="%s"><image src="%s" height="110">%s</a>""" % 
                                       (item.url, item.image_source_url, item.title)  )

我一直在尝试拥有类似的东西

        query.filter("[self.request.get("tag")] =", [self.request.get("tag")])

这样当在单选按钮中选择glam 时,我应该有

        query.filter("glam =", "glam")

但我无法完成这项工作。换句话说,我试图将filter() 的参数设为变量。有什么建议吗?

我正在尝试为图像库创建标记。谢谢。

【问题讨论】:

    标签: python google-app-engine filter google-cloud-datastore


    【解决方案1】:

    这能满足你的要求吗:

    choice = self.request.get("tag")
    query.filter(choice, choice)
    

    但是,我同意下面的 Wooble。按照您的设计方式,您并没有真正使用glam、casual、speaking 作为StringProperty,因为它们要么是空的,要么具有特定的值。

    您可能想要做的是拥有一个 tag 属性,该属性可以从 glam、formal、speaking 中获取不同的值。 ..

    class Item(db.Model):
        ...   
        tag = db.StringProperty()
    

    然后你会像这样查询你的数据库:

    query.filter("tag", self.request.get("tag"))
    

    【讨论】:

      【解决方案2】:
      query.filter(self.request.get("tag"), self.request.get("tag"))
      

      = 实际上不是必需的。

      不过,我也会考虑为标签使用单个 StringProperty,因为看起来您的 3 个字符串属性本质上是布尔值,并且一次只能有一个为真。

      【讨论】:

      • 谢谢,这行得通。但是如果有 2 个不同的项目,1 个标记为 glam 另一个标记为 speaking;每个过滤两次不会返回这两个项目;因为过滤器将查找标记为 glam 和 speaking 的 1 个项目。这似乎是一个不同的问题,所以我会单独问。再次感谢。
      • "...考虑为标签使用单个 StringProperty,因为看起来您的 3 个字符串属性本质上是布尔值,并且一次只能有一个为真。"不确定我是否理解这一点。你的意思是,在Item 模型中使用tag 作为StringProperty 并在该列中输入“glam”、“speaking”等?如果是这样,是的,我应该试试。谢谢。
      猜你喜欢
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 2018-02-15
      • 2014-11-13
      • 2019-05-24
      • 2013-01-13
      • 2015-06-25
      相关资源
      最近更新 更多