这是我的另一个 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__
函数,参数名为replist
。 Rep
的 __init__
函数继承自 db.Model
基类。此函数将提供的任何参数的值分配给模型上同名的属性。因此,在本例中,它将 L
分配给 replist
属性。所以它和原来的两行代码的效果是一样的,但是工作原理有点不同。
回应第二条评论:
Python 中的 = 运算符表示赋值,这与数学等价不同。
所以这段代码:
r = Rep()
并不意味着 r
现在等同于 Rep()
,并且您现在可以使用 r
和 Rep( )
表示同样的事情。
这意味着 r
现在等于 Rep()
的结果。 Rep()
的作用是分配一个 Rep
的新实例。因此,这使得 r
成为对新 Rep
的引用。因此,要稍后引用同一实例,您需要使用 r
,而不是 Rep()
(每次调用时都会分配一个新实例)。
关于python - GAE 中的 fetch() 获取什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4063767/