【问题标题】:gae Model get_by_id() vs get_by_key_name()gae 模型 get_by_id() 与 get_by_key_name()
【发布时间】:2011-06-05 00:49:28
【问题描述】:

我想知道使用 Model.get_by_key_name() 与 Model.get_by_id() 获取记录

例如,假设我要返回一些 JSON,该 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' 方式相比有什么优势吗?

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    您将密钥名称与字符串化密钥混淆了。他们是不同的。键的名称是您在构建时通过保留的 key_name 属性赋予实体的名称。如果不这样做,系统将生成一个 id。实体键可以有名称或 id,但不能同时有。

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

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

    假设您的真正意思是 name 与 id,这是一个更方便的问题。任何性能差异都将是微观的。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 其实应该是Model.get(db.Key(keystring))吧?
      • 没有get()也可以从keystring中获取实体Model.get(keystring)
      • 哦,真的吗?我检查了文档并没有找到任何提及它,但很高兴知道。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 2012-05-27
      相关资源
      最近更新 更多