如何在没有数据库命中的情况下获取db.ReferenceProperty的键值?

时间:2008-09-26 21:05:26

标签: python google-app-engine

有没有办法获取db.ReferenceProperty的键(或id)值,而不取消引用它指向的实际实体?我一直在挖 - 看起来密钥存储为属性名称前面带_,但我无法使任何代码工作。举例非常感谢。感谢。

编辑:这是我尝试失败的原因:

class Comment(db.Model):
    series = db.ReferenceProperty(reference_class=Series);

    def series_id(self):
        return self._series

在我的模板中:

<a href="games/view-series.html?series={{comment.series_id}}#comm{{comment.key.id}}">more</a>

结果:

<a href="games/view-series.html?series=#comm59">more</a>

2 个答案:

答案 0 :(得分:13)

实际上,您提倡访问ReferenceProperty的密钥的方式将来可能不存在。在python中以'_'开头的属性通常被认为是“受保护的”,因为与其实现紧密绑定并且与其实现密切相关的事物可以使用它们,但是随着实现更新的内容必须在其更改时发生变化。

但是,通过公共界面可以访问您的reference-property的密钥,以便将来安全。我将修改上面的例子:

class Comment(db.Model):
    series = db.ReferenceProperty(reference_class=Series);

    def series_id(self):
        return Comment.series.get_value_for_datastore(self)

当您通过与之关联的类访问属性时,您将获得属性对象本身,该对象具有可以获取基础值的公共方法。

答案 1 :(得分:1)

你是对的 - 密钥存储为前缀为“_”的属性名称。您应该只能在模型对象上直接访问它。你能证明你在尝试什么吗?我过去使用过这种技术没有任何问题。

编辑:您是否尝试直接调用series_id()或直接在模板中引用_series?我不确定如果你在这个上下文中指定它们,Django是否会自动调用没有参数的方法。您也可以尝试将@property装饰器放在方法上。