python - GAE 中的 fetch() 获取什么?

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

这是我的另一个 question 的后续内容.

我以为

    mylist = list(Rep().all().fetch(50))

使mylist成为一个列表。但是当我尝试获取它的长度时,我收到了消息

self.response.out.write(len(P))
TypeError: object of type 'Rep' has no len()

谁能解释一下我做错了什么?

    Rep().replist = L                                   
    Rep().put()                              
    mylist = list(Rep().all().fetch(50))
    P = mylist.pop()
    self.response.out.write(len(P))

更新

作为其他可能遇到同样问题的人的引用;我发布了下表,这对我非常有帮助。 (原文here)

Rep().........................Rep object 
Rep.all().....................Query object 
list(Rep.all())...............List of Rep objects. 
list(Rep.all())[0]............A single Rep object 
list(Rep.all())[0].replist....A list

谢谢大家的回答。

最佳答案

而不是这个:

Rep().replist = L                                    
Rep().put()                               
mylist = list(Rep().all().fetch(50)) 
P = mylist.pop() 
self.response.out.write(len(P)) 

尝试这样的事情:

r = Rep()
r.replist = L                                    
r.put()                               
mylist = Rep.all().fetch(50)
P = mylist.pop() 
self.response.out.write(len(P.replist)) 

你的这段代码:

Rep().replist = L                                    
Rep().put()                               

正在创建一个Rep实例,然后将其replist分配给L。然后它创建另一个 Rep,并对其调用 put()。因此,您要写入数据存储区的内容是一个空白的 Rep - 它不会包含您的列表。

在此代码中:

mylist = list(Rep().all().fetch(50)) 

您正在 Rep 的实例上调用 all() - 您应该直接在类上调用它。此外,您不需要将结果包装在 list() 中,因为 fetch() 已经返回一个列表。

然后在下面有这个:

self.response.out.write(len(P)) 

您正在尝试获取 P(它是 Rep)的长度,而不是 P 的长度重新列出

更新:

回应第一条评论:

在此代码中:

r = Rep()

Rep() 正在创建 Rep 的实例。然后,r = 将该实例分配给名称r。所以现在名称 r 指的是 Rep 的该实例。

然后在这段代码中:

r.replist = L

它正在分配r的replist属性来引用列表L

你是对的,你可以这样做,而不是这两行:

r = Rep(replist = L)

它的作用是将L传递给Rep__init__函数,参数名为replistRep__init__ 函数继承自 db.Model 基类。此函数将提供的任何参数的值分配给模型上同名的属性。因此,在本例中,它将 L 分配给 replist 属性。所以它和原来的两行代码的效果是一样的,但是工作原理有点不同。

回应第二条评论:

Python 中的 = 运算符表示赋值,这与数学等价不同。

所以这段代码:

r = Rep()

并不意味着 r 现在等同于 Rep(),并且您现在可以使用 rRep( ) 表示同样的事情。

这意味着 r 现在等于 Rep() 的结果。 Rep() 的作用是分配一个 Rep 的新实例。因此,这使得 r 成为对新 Rep 的引用。因此,要稍后引用同一实例,您需要使用 r,而不是 Rep()(每次调用时都会分配一个新实例)。

关于python - GAE 中的 fetch() 获取什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4063767/

相关文章:

java - Google App Engine 中的 RSA

java - 在谷歌应用引擎数据存储中查询聚合 ("group by"的替代策略

python - 如何在 Anaconda (python3) 上安装 pyWavelets 包?

python - 如何在 pygame 中获取两个碰撞的 Sprite 对象?

python - 如何在嵌套字典中使用 .get()?

google-app-engine - 如何获取 Google App Engine 上的实际 URI?

python - IPython 并行 LoadBalancedView GIL

google-app-engine - 谷歌应用引擎是否提供访问控制解决方案?

google-app-engine - 如何在 Google Cloud Datastore 中搜索数组中的值

google-app-engine - 如何在重新启动之间保留 GoogleAppEngineLauncher 的本地数据存储区?