Google应用引擎:引用4个或更多模型的引用属性

时间:2010-08-25 01:58:18

标签: google-app-engine

HY 我需要为可以引用4种不同模型的模型添加属性:

class WorldObject(db.Model):
    # type can only accept: text, image, profile, position
    # this should be like a set property in relational database and not a string
    type = db.StringProperty(required = True)

    # ???: this can be a reference to Profile, Image, Position or Text model
    # how to do it?
    reference = db.ReferenceProperty(reference_class = ???, required = True)

感谢


@Nick Johnson:

以下是我的帮助:

class WorldObject(db.Model):
# x, y: position in the world
x = db.IntegerProperty(required = True)
y = db.IntegerProperty(required = True)

# world: reference to the world containing it
world = db.ReferenceProperty(reference_class = World)

# profile: is the owner of the object and is the only one who can make changes to it's world object property
owner = db.ReferenceProperty(reference_class = Profile, required = False)

# history
updated = db.DateTimeProperty(auto_now_add = True)
created = db.DateTimeProperty(required = True)

然后:

class ImageWO(WorldObject):
image = db.ReferenceProperty(reference_class = Image, required = False)

然后:

class PositionWO(WorldObject):
position = db.ReferenceProperty(reference_class = Position, required = False)

和其他类是一样的.. 现在,如果我想获取某个区域中的所有世界对象,我该怎么办? 我必须为扩展world_object的每个类做一个请求吗?

3 个答案:

答案 0 :(得分:2)

根据documentation on ReferenceProperty,您可以将reference_class设置为None(或不指定它,因为None是默认值):

  

reference_class是被引用的模型实例的模型类。如果指定,则只能将该类的模型实例分配给此属性。如果为None,则任何模型实例都可以是此属性的值。

答案 1 :(得分:2)

ProfileImagePositionText都扩展相同的基类,它本身扩展了模型。然后,将该基类指定为ReferenceProperty的目标。不需要在StringProperty中存储单独的“类型” - 这将反映在为引用属性存储的密钥中。

答案 2 :(得分:1)

您也可以使用:

references = db.ListProperty(db.Key)

将密钥列表存储到不同的实体。这为您提供了更大的灵活性,因为您可以存储任何类型实体的密钥。

然后,您可以创建一个方便方法,从数据存储区中为您提取属性:

def get_references(self):
    return db.get(self.references)