Я нахожусь в процессе написания своего первого веб-сервиса RESTful поверх GAE и среды выполнения Python 2.7; Я начал с использования блестящего нового ndb API Гвидо.
Однако я не уверен, как решить конкретный случай без неявной функции обратной ссылки исходного API базы данных. Если пользовательский агент запрашивает определенный ресурс, и эти ресурсы удалены на 1 степень:
хост/апи/вид/идентификатор?глубина=2
Каков наилучший способ обнаружить связанный набор сущностей из "одного" в отношении "один ко многим", учитывая, что тип связанного объекта неизвестен во время разработки?
Я не могу использовать запрос на замену, как описано в предыдущий запрос SO из-за последнего ограничения. Тот факт, что мою модель можно определить во время выполнения (и, следовательно, она не жестко запрограммирована), не позволяет мне использовать запрос для фильтрации свойств для сопоставления ключей.
Предки и другие запросы без вида также отсутствуют из-за ограничения хранилища данных, которое не позволяет мне фильтровать свойство без указанного типа.
До сих пор единственная идея, которая у меня была (помимо возврата к 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()