2011-06-05 35 views
8

我想知道获取使用Model.get_by_key_name()VS Model.get_by_id()GAE型号get_by_id()VS

例如,假设我返回一些JSON将被用来显示记录get_by_key_name()一张记录表,每个记录都有一个按钮可以删除该记录。假设我有模型'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的程序员,我是,我需要知道......这是“正确的方法?他们都似乎工作,但是在那种情况下,一个人更喜欢另一个?使用'钥匙'方式和'id'方式有什么优势?

回答

11

您正在将密钥名称与字符串化的密钥混淆。他们不同。密钥的名称是您在构建时通过保留的key_name属性给实体的东西。如果你不这样做,系统会生成一个ID。实体密钥可以具有名称或ID,但不能同时拥有两个名称。

如果你已经有意串化了一个Key,你可以通过将它传递回Key构造函数来重组它。

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

假设你确实是指名称与id,这是一个更方便的问题。任何性能差异都将是微观的。

2

你得到的是一个关键字符串而不是key_name。如果你想从它的关键字符串中获得一个对象。然后你使用Model.get(keystring)。 Key_name是你分配给一个被认为是唯一的对象。如果你认为你可以使用任何独特的属性,你可以把它作为一个key_name,否则去默认生成的id。只有使用key_name才能得到的结果是get_or_insert(),如果具有该键名称的实体存在,则返回实体,否则返回一个实体并返回该实体。

+0

其实应该是'Model.get(db.Key(keystring))'对吗? – 2011-06-06 06:06:41

+0

没有得到()也可以从keystring中得到一个实体Model.get(keystring) – 2011-06-06 06:19:17

+0

噢真的吗?我查阅了文档,没有发现任何提及,但这很好。谢谢。 – 2011-06-07 13:57:02