GAE NDB с Endpoints Proto Datastore: фильтрация по идентификатору эталонного свойства

Я создал модель под названием Building со ссылкой на модель под названием Office. Я хотел бы отфильтровать Buildings по OfficeID в запросе Proto REST (@Building.query_method ....)

В настоящее время я работаю со свойством office_key (необходимо ввести Entity Key of Office), но я хотел бы фильтровать по свойству OfficeID. Есть идеи, как это сделать?

Вот что я пробовал до сих пор:

class Building(EndpointsModel):
    _message_fields_schema = ('id', 'name', 'office')
    name = ndb.StringProperty(default=None, indexed=True)
    office_key = ndb.KeyProperty(kind=Office, required=False)

    def office_setter(self, value):
        self.office_key = ndb.Key('Office', value.id)

    @EndpointsAliasProperty(setter=office_setter, property_type=Office.ProtoModel())
    def office(self):
        return self.office_key.get()


class Office(EndpointsModel):
        _message_fields_schema = ('id', 'name', 'created_date')
        name = ndb.StringProperty(default=None, indexed=True)
        created_date = ndb.DateTimeProperty(auto_now_add=True)

@Building.query_method(query_fields=('limit', 'order', 'pageToken', 'office_key'), path='buildings', name='list')
    def List(self, query):
        return query

person Dariusz Piasecki    schedule 06.02.2016    source источник


Ответы (1)


Похоже, что здание -> офис - это отношение один к одному (и наоборот, отношение офис -> здание много к одному.

Поэтому вам нужно сохранить идентификатор офиса в здании в качестве кэшированного свойства для запросов.

Затем вы можете запросить здания с определенным идентификатором офиса.

Поочередно запросите все здания, которые хранит ключ в office_key == 'какой-то офисный ключ')

person Tim Hoffman    schedule 07.02.2016