SDK Console отображает содержимое, приложение выбирает пустой список - PullRequest
2 голосов
/ 04 февраля 2011

мое текущее приложение использует db.ListProperty(db.Key) для связи многих со многими для списка друзей.

У нас есть следующая схема:

# previous models
class User(db.Model):
    name = db.StringProperty()
    nickname = db.StringProperty()
    join_date = db.DateProperty(auto_now_add=True)
    party = db.ReferenceProperty(PartyEntry, collection_name='participants')
    def by_name(self, string):
        return self.gql("WHERE name = :name", name=string).get()
    def key_by_name(self, string):
        return self.by_name(string).key()

class FriendList(db.Model):
    owner = db.ReferenceProperty(User)
    friends = db.ListProperty(db.Key)

И обработчик, который выбирает список друзей пользователя., обрабатывает и отображает:

class Profile_FriendList(WebBase):
    def get(self):
        user = self._auth()
        if user:
            usr_key = User().key_by_name(user.nickname())
            friend_list = friend_lists = FriendList.all().filter('owner', usr_key).fetch(10)
            self.renderskeleton( { 'friendlist': friend_list } ,'friends.html')

Я заполнил тестовый список друзей двумя записями списка db.Key () в FriendList.friends.Консоль sc SDK (> Interactive Datastorageviewer) отображает мне эти элементы:

key1,key2

Но если я вызову эту сущность FriendList по ее ключу и выведу вывод frlst.friends: [] Та же проблема в обработчике.У меня нет данных, с которыми я могу работать.НО данные существуют.

Исправлено: Проблема FriendList, вызываемый объект Friendlist не был запросом, это просто новый объект FriendList ().Обновленный код.

Исправлено: полный вопрос решен

usr_key = User().key_by_name(user.nickname())
logging.info(user.nickname())
logging.info(usr_key)
friend_list = FriendList().all().filter("owner", usr_key).fetch(20)
logging.info(friend_list)
logging.info(friend_list[0].friends)
friends = User.get(friend_list[0].friends)
logging.info(friends)
self.renderskeleton( { 'friends': friends } , 'friends.html')

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

1 Ответ

2 голосов
/ 04 февраля 2011

friend_list = FriendList(owner=usr_key) это не запрос , он создает новый экземпляр FriendList.

Вы хотите: friend_lists = FriendList.all().filter('owner', usr_key).fetch(10).

Другие комментарии:

  1. Два метода User, которые вы используете для запросов, должны быть методами класса:

    @classmethod
    def by_name(cls, string):
        return cls.gql("WHERE name = :name", name=string).get()
    
    @classmethod
    def key_by_name(cls, string):
        return cls.by_name(string).key()
    
    # to call:
    user = User.key_by_name('their name')
    
  2. Рассматривали ли вы использование идентификатора пользователя с get_by_key_name()?Это будет быстрее, чем запрос.

  3. Также используйте идентификатор пользователя в качестве имени ключа для списка друзей, тогда вместо запроса вы можете выполнить friend_list = FriendList.get_by_key_name(str(user.user_id())).Вам понадобится способ обработать случай, когда одного FriendList недостаточно, но это, вероятно, будет редко - и это не так сложно решить (добавьте порядковый номер к key_name и сохраните (неиндексированный) счетчикпоследовательности на вид пользователя, то вы можете легко сгенерировать имена ключей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...