我想知道使用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'方式有什么好处吗?
答案 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()
,如果存在具有该密钥名称的实体,则返回实体,否则创建一个并返回该实体。