【问题标题】:Need help understanding ReferenceProperty需要帮助了解 ReferenceProperty
【发布时间】:2010-10-18 17:01:11
【问题描述】:

假设我有两个班级:

class A(db.Model):

class B(db.Model):
    a_reference = ReferenceProperty(A)

我现在可以执行以下操作:

a = A()
a.put()

b = B();
b.a_reference = a.key()

b.put()

documentation 声明了以下两件事:

ReferenceProperty 值可以像模型实例一样使用,数据存储实体将在第一次以这种方式使用时被提取并创建模型实例。

后来还说:

应用程序可以显式地 db.get() 一个 ReferenceProperty(它是一个 Key)的值来测试被引用的实体是否存在。

那是什么意思?该值为key,但它可以用作模型实例吗?

如果我这样做:

a2 = b.a_reference

a2 的类型为 A,而不是 key。这是否意味着变量a_reference 将表现得像一个模型实例,直到该实例被删除,然后它将返回一个键(指向一个不存在的实例)?

【问题讨论】:

    标签: python google-app-engine referenceproperty


    【解决方案1】:

    ReferenceProperty 将始终尝试返回存储的键指向的类的实例。如果引用的对象已经被删除,相信你会找回None。 From the docs:

    obj1 = obj2.reference
    
    if not obj1:
        # Referenced entity was deleted.
    

    如果要获取原来存储的密钥,可以使用get_value_for_datastore

    a = A()
    a.put()
    
    b = B();
    b.a_reference = a.key()
    
    b.put()
    
    orginial_key = b.a_reference.get_value_for_datastore()
    

    【讨论】:

    • 啊,我错过了那一点。感谢您为我澄清这一点。
    • 在一个快速实验中,尝试使用指向已删除实体的 ReferenceProperty 引发 Error 并显示消息“ReferenceProperty 无法解析”,而不是返回 None
    • 出色的收获,@Wooble。这确实应该在文档中注明。是只有我一个人,还是 AppEngine 文档有些不那么有条理?
    猜你喜欢
    • 2017-06-19
    • 2016-05-03
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    相关资源
    最近更新 更多