Appengine проблема обратной ссылки - PullRequest
5 голосов
/ 24 января 2011

Согласно документам: http://code.google.com/appengine/docs/python/datastore/datamodeling.html#References автоматически созданный объект обратной ссылки является объектом Query, поэтому возможна итерация по нему и выполнение вызовов извлечения.

Но : У меня есть одна модель:

class User(db.Model):
   name = db.StringProperty()
   ...

и вторая модель:

class Thing(db.Model):
    owner = db.ReferenceProperty(User)
    ...

И когда я пытаюсь получить доступ к обратной ссылке:

for thing in user.thing_set:
    ...

или:

user.thing_set.fetch(100)

Я получаю исключение, подобное этому:

<type 'exceptions.TypeError'>: '_ReverseReferenceProperty' object is not iterable

или вот так:

<type 'exceptions.AttributeError'>: '_ReverseReferenceProperty' object has no attribute 'fetch'

Я делаю что-то не так или произошли некоторые изменения в appengine?Я уверен, что раньше это работало как Query.На странице документов есть даже пример, который показывает то же использование, что и у меня:

for obj in obj1.secondmodel_set:
    # ...

Дополнительно, получение запроса без обратной ссылки работает нормально:

things = Thing.all().filter('owner =', user)

1 Ответ

1 голос
/ 24 января 2011

Оба метода (итерации и выборки) должны работать. Для отладки вы можете войти (или распечатать):

print dir(user)
[..., 'thing_set', ...]

print dir(user.thing_set)
[..., '__iter__', ... , 'fetch', ...]

просто чтобы увидеть, что содержат объекты ... и это может дать вам подсказку о том, что может пойти не так.

Пара идей:

  • Возможно, вы ссылаетесь на другой класс пользователя по ошибке: http://code.google.com/appengine/docs/python/users/userclass.html
  • Ваш пользовательский объект не сохранен.
  • В Windows у вас есть несколько старых файлов .pyc в: C: \ Users \ ИМЯ ПОЛЬЗОВАТЕЛЯ \ AppData \ Local \ VirtualStore \ Program Files (x86) \ Google \ google_appengine
...