Что fetch () выбирает в GAE? - PullRequest
       3

Что fetch () выбирает в GAE?

1 голос
/ 31 октября 2010

Это продолжение моего другого вопроса .

Я думал, что

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

ОБНОВЛЕНИЕ

В качестве справки для тех, кто может столкнуться с той же проблемой;Я публикую следующую таблицу, которая была очень полезна для меня.(Оригинал здесь )

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 ]

3 голосов
/ 01 ноября 2010

Вместо этого:

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

Вы пытаетесьполучить длину P (то есть Rep), а не длину P replist.

Обновление:

В ответ на первый комментарий:

В этом коде:

r = Rep()

Rep() создает экземпляр Rep.Затем r = присваивает этому экземпляру имя r.Так что теперь имя r относится к этому экземпляру Rep.

Затем в этом коде:

r.replist = L

Он присваивает свойству replist r ссылку насписок L.

Вы правы, вместо этих двух строк вы можете сделать это:

r = Rep(replist = L)

Что это значит - передать L в функцию __init__Rep, с именем аргумента replist.Функция __init__ Rep унаследована от базового класса db.Model.Эта функция присваивает значение любых аргументов, предоставленных свойству с тем же именем в модели.Так что в этом случае он присваивает L свойству replist.Таким образом, он имеет тот же эффект, что и исходные две строки кода, но работает немного по-другому.

В ответ на второй комментарий:

Оператор = вPython означает присвоение, которое не совпадает с математической эквивалентностью.

Итак, этот код:

r = Rep()

Не означает, что r теперь эквивалентно Rep(), и что вытеперь можно использовать r и Rep() для обозначения одного и того же.

Это означает, что r теперь равно результату Rep().Rep() выделяет новый экземпляр Rep.Так что r является ссылкой на новый Rep.Чтобы обратиться к тому же экземпляру позже, вам необходимо использовать r, а не Rep() (который будет выделять новый экземпляр при каждом его вызове).

0 голосов
/ 01 ноября 2010

если вы хотите напечатать количество элементов свойство replist .

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

Надеюсь, я смогу вам помочь: p

0 голосов
/ 31 октября 2010

Попробуйте это:

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