Google app engine Google应用程序引擎:对引用属性调用.key().id()是否会触发对该实体的获取?

Google app engine Google应用程序引擎:对引用属性调用.key().id()是否会触发对该实体的获取?,google-app-engine,Google App Engine,如果我有一个具有引用属性的对象,那么对引用属性调用.key()或.key().id()方法会导致从数据存储中检索它吗?或者,我可以在不触发请求的情况下从这些数据中获取值吗 class MyObject(db.Model): reference = db.ReferenceProperty() myObj = MyObject( reference = myOtherObject ) myObj.put() # Will this retrieve the key without do

如果我有一个具有引用属性的对象,那么对引用属性调用.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()

对。访问始终会触发ReferenceProperty子查询

使用ReferenceProperty时,我通常会再存储两个属性。保存参考模型时,我还存储一个代表键的字符串和一个id的int

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()

从模型实例访问属性将取消引用该属性(将获取该属性):

要在不取消引用的情况下获取密钥,请使用:

# 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()

相关:单独存储密钥和ID是完全冗余的,因为
密钥
存储在实体上,并且
ID
可以从中派生。将一个引用属性转换为3个不同的属性,这些属性必须手动更新,这样就不必为数据存储使用
get\u value\u。此外,在示例中,每次访问
.reference
时,都会再次获取它(而
ReferenceProperty
缓存它)。此外,它也不是“子查询”,这是一个数据存储获取操作。
# 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()