【问题标题】:Query a boolean property in NDB Python在 NDB Python 中查询布尔属性
【发布时间】:2016-09-26 12:30:57
【问题描述】:

我有一个问候模型

class Greeting(ndb.Model):
    author = ndb.StructuredProperty(Author)
    content = ndb.TextProperty(indexed=False)
    avatar = ndb.BlobProperty()
    date = ndb.DateTimeProperty(auto_now_add=True)
    public = ndb.BooleanProperty(default=False)

其中我使用以下代码在 Python Google App Engine 的每个页面上查询七个 Greeting 帖子:

posts_query = Greeting.query(
ancestor=session_key(session_name)).order(-Greeting.date)
curs = Cursor(urlsafe=self.request.get('cursor'))
posts,next_curs, more = posts_query.fetch_page(7, start_cursor=curs)

我希望它只显示已公开修改为 True 的帖子,所以我将其更改为

posts_query = Greeting.query(
ancestor=session_key(session_name), Greeting.public == True).order(-Greeting.date) #line changed
curs = Cursor(urlsafe=self.request.get('cursor'))
posts,next_curs, more = posts_query.fetch_page(7, start_cursor=curs)

但是,它给了我一个错误:

File "/home/ralf/Desktop/google_projects/website/views/events.py", line 28
    Greeting.public == True).order(-Greeting.date)
SyntaxError: non-keyword arg after keyword arg

我该如何解决这个问题?这种查询的合适代码是什么?非常感谢您的帮助。

附:如您所见,我也在使用查询游标。

【问题讨论】:

  • 我不确定该问题是否一定与 App Engine 有关。 Python 不允许在关键字参数之后使用非关键字参数(位置)。在关键字参数“ancestor=session_key(session_name)”之后,您有一个位置参数“Greeting.content ==“test8”,因此它不是有效的python。
  • @dyeray 抱歉,我要编辑我的问题。这不是现在显示的错误行。
  • @dyeray 现在更新了。 :)

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


【解决方案1】:

假设您有一些包含位置参数和非位置参数的复杂查询并且变得令人困惑,您也可以将其分成两行:

posts_query = Greeting.query(ancestor=session_key(session_name))
posts_query = posts_query.filter(Greeting.public == True)

这个“过滤器构建”可以根据需要重复多次。

【讨论】:

    【解决方案2】:

    我用这个修复了它

    posts_query = Greeting.query(Greeting.public == True).order(-Greeting.date)
    

    而不是

    posts_query = Greeting.query(ancestor=session_key(session_name),
            Greeting.public == True).order(-Greeting.date)
    

    是的,在查询函数中颠倒ancestor=session_key(session_name)Greeting.public == True 的顺序可以消除错误。但是,我发现我的答案是一个很好的解决方案,因为它是我在我的网站中添加的功能的一部分。

    应用程序的公共用户根本不需要ancestor=session_key(session_name)。他们只是查看页面,根本没有登录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 2014-07-12
      • 2014-07-09
      • 1970-01-01
      相关资源
      最近更新 更多