如何在不访问数据库的情况下获取db.ReferenceProperty的键值?

1 投票
2 回答
1258 浏览
提问于 2025-04-11 09:29

有没有办法在不获取它指向的实际实体的情况下,直接获取一个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)

当你通过与类相关联的方式访问属性时,你会得到属性对象本身,而这个对象有一个公开的方法可以获取底层的值。

撰写回答