0

Google App Engine 폴리 모델을 사용하여 둘 이상의 속성 인스턴스를 가질 수있는 데이터를 모델링하고 있습니다. 연락처에 여러 개의 전화 번호가있을 수 있습니다. 말이 내 설정입니다 : 내가 할 때 이제@property를 통해 정의 된 것을 포함하여 GAE 폴리 모델의 모든 클래스 속성 (파이썬에서)을 얻는 방법

:

class Foo(polymodel.PolyModel): 
    some_prop = ndb.StringProperty() 

    @property 
    def bar(self): 
     return Bar.query(Bar.foo == self.key) 

class Bar(ndb.Model): 
    foo = ndb.KeyProperty(kind = Foo) 
    other_prop= ndb.StringProperty() 

이 ( https://developers.google.com/appengine/articles/modeling 나는 데이터 모델링에이 GAE 문서를 읽은 후이 방법을 가지고) :

Foo._properties 

난 단지에 접근 할 수 다음과 같습니다 :

{'some_prop': StringProperty('some_prop'), 
'class': _ClassKeyProperty('class', repeated=True)} 

정의 된 것을 포함하여 모든 속성에 액세스 할 수있는 방법이 있습니까? ith "@property"?

내가 도움이되지 않을 경우 도움이나 통찰력을 주셔서 감사합니다. - 리

UPDATE :

def props(self): 
    return dict(self._properties.items() + \ 
        {attr_name:getattr(self,attr_name) for \ 
        attr_name, attr_value in \ 
        Foo.__dict__.iteritems() if \ 
        isinstance(attr_value,property)}.items()) 

답변

2

Foo._properties 수행 : @ FastTurle의 훌륭한 답변에 따라 는, 지금 @property를 통해 속성으로 태그를 모두 클래스 속성뿐만 아니라 방법을 반환하는 클래스 메소드를 추가했습니다 google.appengine.ext.db.Property을 상속받은 polymodel.PolyModel에 정의한 속성에 대한 액세스 권한을 가져야합니다.

KeyProperty는, StringProperty는, 등등 ... Foo._properties에 표시된다는 것을 의미합니다, 그래서 당신이 지금 property 장식 모든 방법을 찾을 필요가 있으리라 믿고있어.

다행히도, 그리 어렵지 않습니다. 첫째로, 데코레이터로의 빠른 줄넘기 (이미 이것을 안다면 저를 용서하십시오).

In 파이썬 decorators are just syntactic sugar. 예를 들어,이 두 방법은 같은 일이 발생할 :

@property 
def bar(self): 
    pass 

def bar(self): 
    pass 
bar = property(bar) 

다행히 우리를 위해, property(obj) 새로운 property 개체를 반환합니다. 이는 또한 @propertyproperty 개체를 반환 함을 의미합니다. property을 수업으로 생각할 수 있습니다. 그리고 마지막으로 isinstance(bar, property)을 사용하면 bar이 속성인지 알 수 있습니다.

마지막으로 Foo의 속성을 검사하고 property 인스턴스 만 선택하여 사용할 수 있습니다.

+0

FastTurtle : 와우,이 수준 높은 응답을 너무 빨리 예상하지 못했습니다. 정말 고마워요! 내 코드는 이제 더 멋지게 보입니다 + 나는 데코레이터에 대해 더 많이 알게되었습니다. 내 대답을 편집하여 속성 메서드와 속성 메서드를 모두 반환하기 위해 추가 한 클래스 메서드를 보여줍니다. 다행히도 그것은 의미가 있습니다. 많은 도움을 주셔서 대단히 감사합니다! :) – pixelphantom

+0

@pixelphantom 내 대답이 도움이되었다는 소식을 듣고 기쁘다! 당신이 추가 한 방법은 좋아 보이고 당신이 원하는대로 잘하면됩니다. 행운을 빕니다 :) – FastTurtle