Как добраться до ключевого имени свойства сущности, на которую ссылаются, из экземпляра сущности без хранилища данных, прочитанного в google app engine? - PullRequest
1 голос
/ 02 апреля 2012

Считайте, что у меня есть следующие модели -

class Team(db.Model): # say I have just 5 teams
  name = db.StringProperty()

class Player(db.Model): # say I have thousands of players
  name = db.StringProperty()
  team = db.ReferenceProperty(Team, collection_name="player_set")
  1. Имя ключа для каждой сущности Команды = 'team_', и для каждой сущности Игрока = 'игрок _'

  2. По какой-то предварительной договоренности у меня есть доступное сопоставление сущности Команды (имя-ключа, имя). Например (team_01, Соединенные Штаты Америки), (team_02, Россия) и т. Д.

  3. Я должен показать всех игроков и их команды на странице. Один из способов сделать это будет -

    players = Player.all().fetch(1000) # This is 1 DB read
    for player in players: # This will iterate 1000 times
      self.response.out.write(player.name) # This is obviously not a DB read
      self.response.out.write(player.team.name) #This is a total of 1x1000 = 1000 DB reads
    
  4. То есть чтение 1001 БД для глупости.

  5. Интересная часть состоит в том, что когда я выполняю db.to_dict () для игроков, это показывает, что для каждого игрока в этом списке есть «имя» игрока и есть «имя_ключа» команды доступно тоже.

  6. Так, как я могу сделать ниже ??

    players = Player.all().fetch(1000) # This is 1 DB read
    for player in players: # This will iterate 1000 times
      self.response.out.write(player.name) # This is obviously not a DB read
      self.response.out.write(team_list[player.<SOME WAY OF GETTING TEAM KEY NAME>]) # Here 'team_list' already has (key_name, name) for all 5 teams
    

Я давно с этим борюсь. Прочитал каждую доступную документацию.

Я мог бы просто обнять человека, который может помочь мне здесь: -)

Отказ от ответственности: приведенное выше описание проблемы не является реальным сценарием. Это упрощенная схема, которая точно представляет мою проблему. Я столкнулся с этим в комплексном тестере и большом приложении GAE.

Ответы [ 4 ]

3 голосов
/ 02 апреля 2012

внутри вашего цикла, Player.team.get_value_for_datastore(player) вернет ключевой объект команды без извлечения чего-либо из хранилища данных.

Если вы хотите предварительно выбрать все команды для набора игроков (представьте, что у вас было больше, чем5, поэтому я не хочу их всех извлекать, если они вам не понадобятся), тогда в этом блоге объясняется хорошая техника.

1 голос
/ 02 апреля 2012

Исходя из данной ситуации, единственный способ снизить стоимость БД - это кэшировать Team.Если вы используете новый NDB API, это уже сделано для вас.

1 голос
/ 02 апреля 2012

Если у вас есть команда, к которой многие игроки обращаются по ключу, и вы хотите перечислить некоторое подмножество свойств игрока, когда вы отображаете команду, и вы хотите минимизировать чтение из базы данных, то вам, вероятно, понадобится для денормализации и кэширования некоторого подмножества информации об Игроке в сериализованный большой двоичный объект (или кусок Json), прикрепленный к Команде. Лениво пересчитать блоб при изменении членства (если членство меняется реже, чем взгляды команды, это определенная победа). Этот вид обновления идеально подходит для фоновой задачи.

0 голосов
/ 02 апреля 2012

A ReferenceProperty сохраняет ключ . Вы должны быть в состоянии использовать метод Key * id_or_name , чтобы получить имя ключа.

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