Модели GAE: Как вывести список дочерних узлов в родительском - PullRequest
2 голосов
/ 04 июня 2011

Используя Google App Engine в Python и ссылки, вы автоматически получаете обратную ссылку от ссылочного объекта к тому, с которым вы имеете дело.Это очень хорошо описано в ответе, найденном здесь .

То, что я хотел бы сделать, - это создать (более простое) отношение «один ко многим», где каждая группа имеет список тегов, и каждый тег принадлежит только одной группе.Я представляю себе что-то вроде следующего:

class Group(db.Model):
    # All of my group-specific data here.

class Tag(db.Model):
    text = db.StringProperty(required=True)
    group = db.ReferenceProperty(Group, collection='tags')

Предполагая, что я все правильно понимаю ... В приведенном выше вы получите все Group со свойством tags:

# Get the list of Tag objects that belong to a Group object
mytags = mygroup.tags 

У меня вопрос: есть ли «стандартный» способ включить эту информацию в объект Group?Глядя на модели данных, вы не можете увидеть, глядя на объект Group, что у него есть список тегов, которые к нему применяются.Я хотел бы иметь возможность определить Group,Tags как что-то вроде

class Group(db.Model):
    # This should automatically be the same as the "tags" property that is
    # created for the Group model by the definition of the Tag model
    tags = db.ListProperty(db.Key)
    # All of my group-specific data here.

class Tag(db.Model):
    text = db.StringProperty(required=True)
    group = db.ReferenceProperty(Group, collection='tags', required=True)
    # Other tag specific information here (such as url, etc)

Идея состоит в том, что я хочу видеть, когда я смотрю на модель группы, что у нее есть списокПомечать объекты как свойство.Для меня неестественно мне необходимо взглянуть на модель Tag, чтобы узнать эту информацию.

Примечание: Возможно, стоит отметить, что я планируюналичие Group в качестве родителя (для группы сущностей) каждого из Tag s.Каждый раз, когда я изменяю Group, я буду обновлять его полностью, заменяя все его Tag на новые, и я хочу получить правильный список их для данной "версии" Group IЯ смотрю.

Варианты использования моих данных:

  • Обновление групп - создание или обновление 6 групп.Если создать, то создайте теги для группы.При обновлении полностью замените теги для группы (удаляя старые) - это происходит каждые 5 минут или около того
  • Чтение недавних групп - получение 6-20 (еще не решенных) самых последних измененныхгруппы, не нужно загружать их теги
  • Читать одну группу - получить информацию для отдельной группы, включая ее теги (каждая из которых будет иметь от 10 до 20 тегов)

Ответы [ 3 ]

1 голос
/ 04 июня 2011

Наличие свойства ListProperty, как вы предлагаете, будет, как вы, вероятно, понимаете, означать, что вы сохраняете две ссылки избыточно, что не является необходимым.Более простым подходом было бы просто отметить в комментарии, описывающем отношения.

Если вы все равно собираетесь использовать группы сущностей, вам не нужны ReferenceProperty или ListProperty.Вы можете получить Tag потомков Group с помощью Tag.all().ancestor(my_group).

Другой вариант - сохранить теги в виде списка строк.Дополнительная информация может храниться в Tag сущностях с key_name s, установленными на имя тега.Затем вы можете выбрать все объекты тегов, на которые ссылается объект, с помощью Tag.get_by_key_name(my_entity.tags).Это в основном полезно, если вам обычно нужны только имена тегов и только иногда извлекаются полные данные - в противном случае вы также можете придерживаться ReferenceProperty или группы сущностей.

1 голос
/ 04 июня 2011

Как вы собираетесь запрашивать ваши теги, будете ли вы касаться только тегов из определенной группы объектов? Если это так, то, поскольку вы собираетесь поместить свои Tag сущности в группу сущностей Group сущности, ReferenceProperty не предоставляет реального значения. Вместо этого вы можете использовать tag_entity.key().parent() для получения ключа Group сущности или tag_entity.parent() для получения Group самой сущности. Затем вы могли бы использовать ListProperty на Group для хранения имен ключей тегов сущностей (которые, как я полагаю, будут фактическими «тегами»).

Поскольку вы заменяете все теги группы каждый раз, когда обновляется сущность Group, рассматривали ли вы возможность использования ListProperty для сохранения своих тегов непосредственно на сущности Group. Или, сохраняя список тэгов key_names непосредственно в Group. Любой подход сделает выбор всех тегов для группы довольно простым и эффективным.

0 голосов
/ 04 июня 2011

моделирование в appengine

один-ко-многим с использованием родителя в этом вам пригодится

вы также можете рассмотреть другие примеры

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