2013-01-15 2 views
2

영구적 인 appengine 모델에서 다른 클래스를 참조하고자합니다. 마찬가지로 :Python에서 참조 된 클래스 유형을 효과적으로 저장하는 방법은 무엇입니까? (appengine)

class Animal(): 
    def eat(self, food): 
    return food - 1 

class Cat(Animal): 
    def eat(self, food): 
    return food - 2 

class Dog(Animal): 
    def eat(self, food): 
    return food - 3 

class Person(db.Model): 
    name = db.StringProperty() 
    pet = Animal() 

나는 애완 동물로 고양이() 또는 개() 예 중 하나를 지정하여 저장하고에서 참조 동물의 원래 유형 Person 객체를 다시로드 할 수있을 수 있어야합니다. 애완 동물 개체에 대한 지속성은 중요하지 않으며 클래스의 메서드를 사용하여 다양한 동작 집합 만 정의하려고합니다. 어떻게해야합니까?

감사합니다.

+0

'Animal' 하위 클래스 인'db.Model'이 있습니까? 아니면 정확히 여기에 넣은 것과 똑같습니까? 'Animal'이 모델 클래스라면,'Person'에서'Animal'에'ReferenceProperty'를 사용할 수 있습니다. – RocketDonkey

+0

아니, 아니, 나는 Animal 클래스와 그 자식들이 영속적이지 않다라고 말한 이유 다. 나는 Animal 클래스를 db.Model 또는 db.PolyModel로 만들면 영구 변수가 없어도 문제가 해결되지 않는다고 생각합니다. – greg

답변

1

PolyModel 클래스를 확인하십시오.

class Person(db.Model): 
    name = StringProperty() 
    pet = StringProperty(choices=('cat','dog')) 

    def get_pet(self): 
    dict = { 'cat': Cat, 'dog': Dog } 
    return dict[self.pet] 

내가이 추가로 제공 애완 동물 유형의 목록을 유지해야 할이 방법 :

+0

내 이해하기 PolyModel은 ** 쿼리 **에서 정의한 클래스 유형을 반환합니다. Animal.all()은 Dog 및 Cat 레코드 모두의 공통 변수를 반환하지만 Animal()을 사용합니다. 퍼시 스턴트 Person 객체를 통해 Dog와 Cat의 특정 메소드에 액세스 할 수 있기를 원합니다. – greg

0

나 자신을 가지고 올 수있는 최선은 getter 메소드 (위의 동물을 가정, 고양이, 개 클래스)입니다 장소 (저장된 문자열 변수 및 문자열 클래스 쌍의 사전 선택). 이 일을하는 데 더 자유롭고 우아한 방법이 있을까요?

관련 문제