Google App Engine: вызывает ли вызов .key (). Id () для ссылочного свойства инициировать получение этого объекта? - PullRequest
3 голосов
/ 11 августа 2011

Если у меня есть объект со ссылочным свойством, вызовет ли метод .key () или .key (). Id () для ссылочного свойства вызвать его из хранилища данных? Или я могу получить значение от тех без запроса запуска?

class MyObject(db.Model):
    reference = db.ReferenceProperty()

myObj = MyObject( reference = myOtherObject )
myObj.put()

# Will this retrieve the key without doing a get for the object?
temp1 = myObj.reference.key()

# What about this?
temp2 = myObj.reference.key().id()

Ответы [ 2 ]

10 голосов
/ 11 августа 2011

При доступе к свойству из экземпляра модели оно будет удалено из ссылки (оно будет получено):

# This will retrieve the key after doing a get for the object.
temp1 = myObj.reference.key()

Чтобы получить ключ без разыменования, используйте:

# This will retrieve the key without doing a get for the object.
temp1 = MyObject.reference.get_value_for_datastore(myObj)

# Then you get the id...
temp2 = temp1.id()
0 голосов
/ 11 августа 2011

Да.Доступ всегда вызывает подзапрос ReferenceProperty.

Я обычно сохраняю еще два свойства при использовании ReferenceProperty.При сохранении эталонной модели я также сохраняю строку, представляющую ключ, и целое число для идентификатора.

class MyObject(db.Model):
    reference = db.ReferenceProperty()
    referenceStrKey = db.StringProperty()
    referenceId = db.IntProperty()

В последнее время я храню ключ только в виде строки, а затем объявление в свойствах:

class MyObject(db.Model):
    referenceStrKey = db.StringProperty()

    @property
    def reference(self):
        return RefModel.get(db.Key(self.referenceStrKey))

    @property
    def referenceId(self):
        return db.Key(self.referenceStrKey).id()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...