0

Начал эту неделю с помощью 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"} 

Смотрели повсюду, но не могли найти хороший запрос. Как должен быть запрос получить этот результат?

+0

Можете ли вы подтвердить ваш запрос предназначен, чтобы вернуть все 'объекты Subscription'? Вы пытались использовать параметры декоратора 'response_fields' и' collection_fields', например [этот пример] (http://endpoints-proto-datastore.appspot.com/examples/custom_api_response_messages.html)? Мне было бы интересно узнать результат (я обнаружил, что Cloud Endpoint не так хорошо документированы на Python по сравнению с Java). – tx802

+0

Да, целью является возвращение всех объектов 'Subscription'. Нет, еще не пробовал. Я не знал бы способа сделать запрос, чтобы он извлекал «журнал», принадлежащий ключу. В SQL я бы использовал внутреннее соединение, но не знаю, в NoSQL – Esra

+0

Я не изучал 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

ответ

1

Если я прочитал ваш код, вы используете конечный пункт proto datastore, который предлагает EndpointsAliasProperty. В вашем примере вы можете использовать его, чтобы получить правильную подписку: переименовать журнал magazine_key и определить в вашей модели в EndpointsAliasProperty:

@EndpointsAliasProperty(property_type=Subscription.ProtoModel()) 
def magazine(self): 
    if self.magazine_key != None: 
     magazine = self.magazine_key.get() 
     return magazine