Механизм приложений Google: ссылочное свойство, которое ссылается на 4 модели или более - PullRequest
3 голосов
/ 25 августа 2010

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)

и другие классы такие же ..Теперь, если я хочу собрать все объекты мира в области, как мне это сделать?Я должен сделать 1 запрос для каждого класса, который расширяет world_object?

Ответы [ 3 ]

2 голосов
/ 25 августа 2010

Make Profile, Image, Position и Text расширяют один и тот же базовый класс, который сам расширяет Model.Затем укажите этот базовый класс в качестве цели для ReferenceProperty.Нет необходимости хранить отдельный тип в StringProperty - это будет отражено в ключе, сохраненном для ссылочного свойства.

2 голосов
/ 25 августа 2010

Согласно документации для ReferenceProperty , вы можете просто установить reference_class на None (или не указывать его, поскольку None является значением по умолчанию):

reference_class - класс моделиэкземпляра модели, на которую ссылаются.Если указано, этому свойству могут быть назначены только экземпляры модели класса.Если None, любой экземпляр модели может быть значением этого свойства.

1 голос
/ 25 августа 2010

Вы также можете использовать:

references = db.ListProperty(db.Key)

для сохранения списка ключей для различных объектов.Это дает вам больше гибкости, так как вы можете хранить ключи сущностей любого вида.

Затем вы можете создать удобный метод, который выбирает для вас свойства из хранилища данных:

def get_references(self):
    return db.get(self.references)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...