Следующие обратные ссылки неизвестных видов в NDB

Я в процессе написания своего первого веб-сервиса RESTful на GAE и в среде исполнения Python 2.7; Я начал использовать блестящий новый ndb-интерфейс Guido.

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

хост / API / тип / идентификатор? Глубина = 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() 

2 Solutions collect form web for “Следующие обратные ссылки неизвестных видов в NDB”

Интересный вопрос! Поэтому в основном вы хотите посмотреть на класс Contact и выяснить, есть ли какой-либо другой класс модели, который имеет KeyProperty, ссылающийся на него; в этом примере PhoneNumber (но их может быть много).

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

Вы можете сделать это легко для своих пользователей, предоставив им подкласс KeyProperty, который позаботится об этом; например

 class LinkedKeyProperty(ndb.KeyProperty): def _fix_up(self, cls, code_name): super(LinkedKeyProperty, self)._fix_up(cls, code_name) modelclass = ndb.Model._kind_map[self._kind] collection_name = '%s_ref_%s_to_%s' % (cls.__name__, code_name, modelclass.__name__) setattr(modelclass, collection_name, (cls, self)) 

Именно то, как вы выбираете имя для коллекции и ценность для хранения, зависит от вас; просто поставьте что-то там, что упростит вам переход по ссылке. В примере будет создан новый атрибут Contact:

 Contact.PhoneNumber_ref_contact_to_Contact == (PhoneNumber, PhoneNumber.contact) 

[отредактировано, чтобы заставить код работать и добавить пример. :-)]

ndb.StructuredProperty как хороший пример использования для ndb.StructuredProperty .

  • Как переключиться на активную вкладку в Selenium?
  • Google App Engine говорит: «Должен пройти проверку подлинности». При попытке развернуть любое приложение
  • Новая функция GAE NDB Datastore: объекты Access Datastore из другого приложения GAE
  • Как получить отличное значение одной из моих моделей в Google App Engine
  • Смешивание python с более быстрым языком для оптимизации в GAE
  • Имя текущего приложения в Google App Engine (Python)
  • Функция Pubnub Presence в Python (GAE)
  • Должно ли мое приложение по умолчанию развертываться на appspot.com?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.