Начал эту неделю с помощью Google App Engine с конечными точками Python. Целью является запрос объекта и включение всех значений ключевого свойства. Модели:Как запросить ndb для всех свойств и включить значения keyproperty?
class Person(EndpointsModel):
_message_fields_schema = ('id', 'surname', 'lastname', 'created')
surname = ndb.StringProperty(indexed=False)
lastname = ndb.StringProperty(indexed=False)
class Magazine(EndpointsModel):
_message_fields_schema = ('id', 'name')
name = ndb.StringProperty(indexed=False)
class Subscription(EndpointsModel):
_message_fields_schema = ('id', 'publication', 'person', 'amount')
magazine = ndb.KeyProperty(kind=Magazine)
person = ndb.KeyProperty(kind=Person)
amount = ndb.IntegerProperty()
Эти модели запрашиваются следующие действия, чтобы получить все элементы:
@endpoints.api(name='subscription', version='v1', description='REST API for Subscriptions')
class SubscriptionV1(remote.Service):
@Subscription.query_method(path='subscriptions', name='subscriptions.list')
def SubscriptionList(self, query):
return query
В результате получается:
{
"items": [
{
"created": "2015-02-13T09:40:22.514000",
"id": "6225984592281600",
"modified": "2015-02-13T09:40:22.514000",
"magazine": "ahNkZXZ-YXZpYW4tc2xpY2UtODUwchgLEgtQdWJsaWNhdGlvbhiAgICAgND7CQw",
"synced": false
}
]
}
В то время как я хочу, чтобы это было:
"magazine": {"id": 123456789123456789,
"name": "Tech magazine"}
Смотрели повсюду, но не могли найти хороший запрос. Как должен быть запрос получить этот результат?
Можете ли вы подтвердить ваш запрос предназначен, чтобы вернуть все 'объекты Subscription'? Вы пытались использовать параметры декоратора 'response_fields' и' collection_fields', например [этот пример] (http://endpoints-proto-datastore.appspot.com/examples/custom_api_response_messages.html)? Мне было бы интересно узнать результат (я обнаружил, что Cloud Endpoint не так хорошо документированы на Python по сравнению с Java). – tx802
Да, целью является возвращение всех объектов 'Subscription'. Нет, еще не пробовал. Я не знал бы способа сделать запрос, чтобы он извлекал «журнал», принадлежащий ключу. В SQL я бы использовал внутреннее соединение, но не знаю, в NoSQL – Esra
Я не изучал Cloud Endpoints много в Python, но я думаю, вам, возможно, придется посмотреть на использование базового [ProtoRPC] (https: // cloud. google.com/appengine/docs/python/tools/protorpc/) для создания собственных сообщений. Тем не менее, имейте в виду, что если вы выполняете отдельную операцию «get» Datastore на каждом из ваших «журнальных» журналов 'Subscription', это будет не очень эффективно. Конечно, 'ndb' будет кэшировать сущности, но промахи в кеше будут дорогостоящими. [Cloud Trace] (https://cloud.google.com/tools/cloud-trace) покажет вам RPC за вашим API 'subscriptions.list'. – tx802