Я пишу свой первый веб-сервис 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()