Включать (не ссылаться) одну модель внутри другой в хранилище данных App Engine? - PullRequest
1 голос
/ 22 февраля 2012

Люди из стека, привет.

Я чувствую, что должен быть очевидный ответ, но я провел большой поиск и прочитал много документов и кода и не могу прийти к нему.

(я собираюсь скрыть некоторые из реальных имен и так далее по причинам конфиденциальности ниже ...)

Это мой первый проект AppEngine, хотя я написал много Python.

Я пишу простое приложение, которое концептуально имеет только одну "таблицу базы данных", одну модель - назовите ее Person, она представляет одного человека в этом клубе владельцев собак.

У человека много частей, некоторые из которых повторяют части со своей собственной внутренней структурой, например «DogsOwned» и «PlayDates».Я хочу иметь отдельные определения для этих частей, которые я объединяю вместе, чтобы создать полную модель, поэтому у меня есть DogsOwned.py и PlayDates.py, на которые есть ссылки в моем основном файле Person.py.

Я повторяю, что мне не нужна отдельная «таблица базы данных» DogsOwned или PlayDates!Я только заинтересован в DogsOwned или PlayDates, которые включены в состав Person.

К сожалению, google.appengine.ext.db.Model, похоже, не может включить другую модель.Вы можете использовать google.appengine.ext.db.ReferenceProperty, но, похоже, ссылается на другой объект по ключу, требуя от меня "создать другую таблицу базы данных" (я знаю, что моя терминология не совсем верна, но вы поняли идею).*

Таким образом, чтобы получить всю запись Person, мне кажется, что должно быть несколько запросов, один для получения Person и один для каждой записи в DogsOwned или PlayDates.Все они будут совместно использовать одну и ту же группу сущностей, поэтому они должны быть связными, и все они должны масштабироваться, но «я» получает оплату от Google «по запросу» в некотором смысле за это, когда дело доходит до этого, поэтому я 'Мне бы хотелось, чтобы количество запросов было как можно ниже.Или ... возможно, группа сущностей каким-то волшебным образом решает мою проблему?

Ваши просвещающие комментарии требуют!Заранее спасибо.

ОБНОВЛЕНИЕ:

Другими словами: я хочу, чтобы Модель содержала повторяющиеся подэлементы - в псевдокоде,

struct Person {
  Dog dogsOwned[];
  PlayDates playDates[];
};

, где находятся Dogs и PlayDatesСвойства не примитивные.

Наследование Python для этого бесполезно - вы не можете наследовать один и тот же класс несколько раз, и что более важно, я хочу «содержит», а не «isa».

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Вы можете сохранить все объекты в одной и той же группе объектов, указав, что Person является родительским объектом для двух других типов (IIRC).Если даты собак и игр можно безопасно сериализовать, вы можете использовать StringListProperty для их версий JSON и хранить все внутри сущности Person.

Если вы хотите поддерживать операции хранилища данных на низком уровне, вы можете использовать memcache, чтобы предотвратитьповторные чтения популярных объектов.

0 голосов
/ 22 февраля 2012

Черт возьми, я не хочу отвечать на свой вопрос, но я покопался в исходном коде и нашел его!

Ответ - google.appengine.ext.ndb.model.StructuredProperty.

Из кода:

StructuredProperty отличается от большинства других свойств;это позволяет вам определить подструктуру для ваших сущностей.Сама подструктура определяется с использованием класса модели, а значение атрибута является экземпляром этого класса модели.Однако он не хранится в хранилище данных как отдельный объект;вместо этого значения его атрибутов включаются в родительский объект с использованием соглашения об именах (имя структурированного атрибута, за которым следует точка, за которой следует имя податрибута).

Существует очень мало документации, кроме самого кода (который является обильным), но GvR говорит об этом здесь .

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

0 голосов
/ 22 февраля 2012

Я действительно не понимаю вашу структуру, но как насчет других простых классов, которые вы подклассируете с помощью вашей модели Person?

как:

class DogsOwned(object):  
    # variables, functions and whatever else you want

class PlayDates(object):  
    # same as above

class Person(db.Model, DogsOwned, PlayDates):
    # the rest of your code.

Опять довольно неясно, какова ваша цель ...

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