如何在不访问数据库的情况下获取db.ReferenceProperty的键值?
有没有办法在不获取它指向的实际实体的情况下,直接获取一个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 个回答
1
你说得对 - 这个关键是以属性名开头加上一个'_'来存储的。你应该可以直接在模型对象上访问它。你能演示一下你在尝试什么吗?我以前用过这种方法,没有遇到问题。
编辑:你有没有试过直接调用 series_id(),或者在你的模板中直接引用 _series?我不太确定在这种情况下,Django 是否会自动调用没有参数的方法。你也可以试着在这个方法上加上 @property 装饰器。
13
其实,你提到的通过某种方式来获取ReferenceProperty的键,未来可能就不存在了。在Python中,以'_'开头的属性通常被认为是“受保护的”,这意味着只有与其实现紧密相关的部分可以使用这些属性,而那些依赖于实现的部分在实现变化时也必须跟着变化。
不过,有一种通过公开接口的方法可以安全地获取你的引用属性的键,这样在未来就不会出问题。我会修改上面的例子:
class Comment(db.Model):
series = db.ReferenceProperty(reference_class=Series);
def series_id(self):
return Comment.series.get_value_for_datastore(self)
当你通过与类相关联的方式访问属性时,你会得到属性对象本身,而这个对象有一个公开的方法可以获取底层的值。