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)
感谢
以下是我的帮助:
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的每个类做一个请求吗?
答案 0 :(得分:2)
根据documentation on ReferenceProperty,您可以将reference_class设置为None(或不指定它,因为None是默认值):
reference_class是被引用的模型实例的模型类。如果指定,则只能将该类的模型实例分配给此属性。如果为None,则任何模型实例都可以是此属性的值。
答案 1 :(得分:2)
让Profile
,Image
,Position
和Text
都扩展相同的基类,它本身扩展了模型。然后,将该基类指定为ReferenceProperty的目标。不需要在StringProperty中存储单独的“类型” - 这将反映在为引用属性存储的密钥中。
答案 2 :(得分:1)
您也可以使用:
references = db.ListProperty(db.Key)
将密钥列表存储到不同的实体。这为您提供了更大的灵活性,因为您可以存储任何类型实体的密钥。
然后,您可以创建一个方便方法,从数据存储区中为您提取属性:
def get_references(self):
return db.get(self.references)