Следование обратным ссылкам неизвестного типа в NDB

Я пишу свой первый веб-сервис RESTful поверх GAE и среды выполнения Python 2.7; Я начал с использования блестящего нового ndb API Гвидо.

Тем не менее, я не уверен, как решить конкретный случай без неявной функции обратной ссылки исходного API базы данных. Если пользовательский агент запрашивает определенный ресурс и эти ресурсы удалены на 1 степень:

host/api/kind/id?depth=2

Как лучше всего обнаружить связанный набор объектов из «одного» в отношение «один ко многим», учитывая, что тип связанного объекта неизвестен во время разработки?

  • Я не могу использовать запрос на замену, как описано в предыдущем запросе SOиз-за последнего ограничения. Тот факт, что мою модель можно определить во время выполнения (и, следовательно, она не жестко закодирована), не позволяет мне использовать запрос для фильтрации свойств для сопоставления ключей.

  • Ancestor и другие запросы без вида также отсутствуют из-за ограничения хранилища данных, которое не позволяет мне фильтровать свойство без указанного вида.

До сих пор единственной идеей, которая у меня была (помимо возврата к db api), является использование межгрупповой транзакции для написания моей собственной ссылки на «один», либо путем обновления ndb.StringProperty(repeat= True), содержащий все родственные виды, когда вводится сущность нового вида или просто поддерживает список ключей на «одном» ndb.KeyProperty(repeat=True) каждый раз, когда связанный объект «многие» записывается в хранилище данных.

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

Учитывая предложение jmort253, я попытаюсь дополнить свой вопрос конкретным примером, адаптированным из документации:

class Contact(ndb.Expando):
    """ The One """

    # basic info
    name = ndb.StringProperty()
    birth_day = ndb.DateProperty()

    # If I were using db, a collection called 'phone_numbers' would be implicitly 
    # created here.  I could use this property to retrieve related phone numbers 
    # when this entity was queried.  Since NDB lacks this feature, the service 
    # will neither have a reference to query nor the means to know the 
    # relationship exists in the first place since it cannot be hard-coded.  The
    # data model is extensible and user-defined at runtime; most relationships
    # will be described only in the data, and must be discoverable by the server.
    # In this case, when Contact is queried, I need a way to retrieve the
    # collection of phone numbers.

    # Company info.
    company_title = ndb.StringProperty()
    company_name = ndb.StringProperty()
    company_description = ndb.StringProperty()
    company_address = ndb.PostalAddressProperty()

class PhoneNumber(ndb.Expando):
    """ The Many """

    # no collection_name='phone_numbers' equivalent exists for the key property
    contact = ndb.KeyProperty(kind='Contact')
    number = ndb.PhoneNumberProperty()

7
задан Community 23 May 2017 в 12:17
поделиться