2013-10-02 3 views
0

계산 된 속성을 쿼리하는 방법은 무엇입니까? 이 경우 query에서 query_method에서 ComputedProperty를 필터링하는 방법은 무엇입니까?

class MyModel(EndpointsModel): 
    attr1 = ndb.IntegerProperty(default=0) 

    @EndpointsComputedProperty(property_type=messages.BooleanField) 
    def attr2(self): 
    return self.attr1 % 2 == 1 


@endpoints.api(name='myapi', version='v1', description='My Little API') 
class MyApi(remote.Service): 

    @MyModel.query_method(query_fields=('attr2'), 
         path='mymodels', name='mymodel.list') 
    def MyModelList(self, query): 
    return query 

항상 attr2 == False을 테스트하는 필터를해야합니다.

원인은 필터가 FromMessage으로 만든 엔티티에서 생성 된 것 같습니다. attr2은 계산 된 속성이므로 설정할 수 없습니다. 0-attr1 기본값으로, attr2에 관계없이 항상에 전달되는 거짓입니다

+0

쿼리하려는 경우 계산 된 속성이 아니어야합니다. "수행"하는 유일한 방법은 모든 엔터티를 검색 한 다음 계산 된 속성을 확인하는 것입니다. Khan Academy가 읽는 시간보다는 쓰기 시간에 값 비싼 물건을 꺼내는 것에 대해 작성한 자료 중 일부를 읽어야합니다. – bossylobster

+0

@bossylobster 사실, 쿼리하고 싶다면 ComputedProperty 여야합니다. 'ComputedProperty'의 전체적인 요점은 계산시 값을 데이터 저장소에 쓰기 시간에 저장한다는 것입니다. 당신이 설명하는 시나리오는 일반적인'@ 속성 '의 경우 일 것이다. MyModel.query (MyModel.attr2 == True)는 예상대로 행복하게 작동합니다. MyModel.query_method는 읽기 전용 속성 (예 : ComputedProperty)을 설정할 수 없으므로 예기치 않은 동작을 보여 주지만 필터에서 행복하게 사용합니다. – sstriker

+0

사과, 별칭 속성에 대해 생각하고있었습니다. – bossylobster

답변

0
여기에 설명 된대로, 불평등 쿼리를 달성 할 수있는 방법과 유사한 자리 별칭 속성을 설정하여 계산 된 속성에 대해 조회 할 수 있습니다

:. https://stackoverflow.com/a/17288934/4139124

보다 구체적으로 기존 attr1 및 attr2 필드와 다른 이름으로 별칭 속성을 설정합니다. alias 속성이 할당 될 때마다 호출되는 setter를 정의하고이 setter를 사용하여 쿼리를 수정합니다. 세터 별칭 속성 위에 표시해야합니다 : myapi/mymodels?attr2_alias=true를 쿼리하는 모든 반환합니다, 예를 들어,

@endpoints.api(name='myapi', version='v1', description='My Little API') 
class MyApi(remote.Service): 

    @MyModel.query_method(query_fields=('attr2_alias'), 
          path='mymodels', name='mymodel.list') 
    def MyModelList(self, query): 
     return query 

다음 :

import logging 
from google.appengine.ext import ndb 
from endpoints_proto_datastore.ndb import EndpointsModel 
from endpoints_proto_datastore.ndb.properties import EndpointsAliasProperty 
from endpoints_proto_datastore.ndb.properties import EndpointsComputedProperty 
from protorpc import messages 

class MyModel(EndpointsModel): 
    attr1 = ndb.IntegerProperty(default=0) 

    @EndpointsComputedProperty(property_type=messages.BooleanField) 
    def attr2(self): 
     return self.attr1 % 2 == 1 

    def Attr2AliasSetter(self, value): 
     self._endpoints_query_info._filters.add(MyModel.attr2 == value) 

    @EndpointsAliasProperty(name='attr2_alias', 
          property_type=messages.BooleanField, 
          setter=Attr2AliasSetter) 
    def Attr2Alias(self): 
     logging.error('attr2_alias should never be accessed') 

우리는 다음 ATTR2보다는 attr2_alias 필드를 받아들이는 query_method를 업데이트 attr2가 true로 설정된 MyModel 엔티티

관련 문제