gae Model get_by_id()vs get_by_key_name()

时间:2011-06-05 00:49:28

标签: python google-app-engine

我想知道使用Model.get_by_key_name()与Model.get_by_id()

获取记录

例如,假设我正在返回一些用于显示记录表的JSON,并且对于每个记录,都有一个删除该记录的按钮。假设我有模型'Foo'和模型实例'foo'。

我相信我可以使用以下方法将每个按钮与相应的记录相关联:

str(foo.key())  #suppose it eval's to "axhYm92ZZXJvY2tyDgsSCENhnb3J5GBQM"

foo.key().id()  #suppose it eval's to "57"

其中一个值将进入HTML表单,用户可以单击按钮,该请求将使用此键/ id删除记录。

然后请求将导致:

Foo.get_by_key_name("axhYm92ZZXJvY2tyDgsSCENhnb3J5GBQM").delete()

Foo.get_by_id(57).delete()

现在,作为犹豫不决的ADHD程序员,我需要知道......这是“正确的”方式吗?他们似乎都工作,但是有哪些情况使一个人比另一个更好?使用'key'方式与'id'方式有什么好处吗?

2 个答案:

答案 0 :(得分:11)

您将Key name与字符串化Key混淆。他们是不同的。密钥的名称是您在构造时通过保留的key_name属性为实体提供的名称。如果不这样做,系统将生成一个id。实体键可以具有名称或ID,但不能同时具有两者。

如果您有意将字符串化,则可以通过将其传递回Key构造函数来重新构建它。

stringifiedKey = str(key)
reconstitutedKey = db.Key(stringifiedKey)

假设你真的意味着名字与身份,这是一个更方便的问题。任何性能差异都将是微观的。

答案 1 :(得分:2)

你得到的是一个关键字符串而不是key_name。如果你想从它的关键字符串中获取一个对象。然后使用Model.get(keystring)。 Key_name是您分配给应该是唯一的对象的。如果您认为可以使用任何唯一的属性,则可以将其设置为key_name,否则请转到默认生成的ID。只有使用key_name才能获得get_or_insert(),如果存在具有该密钥名称的实体,则返回实体,否则创建一个并返回该实体。