在GAE中fetch()获取什么?

时间:2010-10-31 15:45:28

标签: 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

感谢所有答案。

3 个答案:

答案 0 :(得分:3)

而不是:

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)) 

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

然后在下面你有这个:

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

您试图获得PRep)的长度,而不是P replist的长度。

<强>更新

回应第一条评论:

在此代码中:

r = Rep()

Rep()正在创建Rep的实例。然后r =将该实例分配给名称r。现在名称r引用了Rep的实例。

然后在这段代码中:

r.replist = L

指定r的replist属性以引用列表L

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

r = Rep(replist = L)

这样做是将L传递给__init__的{​​{1}}函数,参数名称为Repreplist __init__函数继承自Rep基类。此函数指定提供给模型上同名属性的任何参数的值。因此,在这种情况下,它会将db.Model分配给L属性。因此它与原始的两行代码具有相同的效果,但它的工作方式略有不同。

回应第二条评论:

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

所以这段代码:

replist

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

这意味着Rep()现在等于r的结果。 Rep()的作用是分配Rep()的新实例。这样,Rep就可以引用新的r。要在以后引用同一个实例,您需要使用Rep,而不是r(每次调用时都会分配一个新实例)。

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

如果您要打印重新列表属性的元素数量。

self.response.write(len(P.replist));

希望我能帮到你:p