【发布时间】:2017-02-22 21:11:29
【问题描述】:
我在使用 python/ndb 从 GAE 中的键中删除实体时遇到问题。我能够从页面中检索实体(问题)键,但无法弄清楚如何删除它。 GAE 支持页面说它就像检索密钥然后删除它一样简单,如下所示。
problem = problem_key.get()
problem.key.delete()
但这不起作用。我很确定密钥已正确获取。 HTML 看起来像
{%for problem in problems %}
<tr>
<td>{{ problem.tags }}</td>
<td><script type="math/tex">{{ problem.content }}</script></td>
<td>{{ problem.answer }}</td>
<td>{{ problem.quiz }}</td>
<td>{{ problem.id }}</td>
<td>{{ problem.date }}</td>
<form action="/deleteProblem" method="POST">
<td><button type="submit" name="problem_key" value="{{ problem.key }}">Delete Problem</button></td>
</form>
</tr>
{% endfor %}
我的python代码如下:
class deleteHandler(BaseHandler):
def post(self):
prob_key = self.request.get('problem_key')
problem = prob_key.get()
problem.key.delete()
self.redirect("/")
我得到:
problem = prob_key.get()
AttributeError: 'unicode' object has no attribute 'get'
我最好的猜测是 prob_key 被分配了实际的 unicode,所以当然没有 get() 方法,但我不明白如何根据谷歌对它应该如何工作的解释来解决这个问题。
编辑:好的,已经调查了一段时间,我改变了这一行:
prob_key = self.request.get('problem_key')
到
prob_key = ndb.Key('Problem', int(self.request.get('problem_id')
因为据我了解,可以通过以下方式构造密钥
ndb.Key('kind', 'id')
不幸的是,我仍然无法让它工作。我现在得到了
problem.key.delete()
AttributeError: NoneType has no attribute 'key'
【问题讨论】:
-
您还没有传递实际的 Key 对象。从传递的字符串创建一个 Key 对象,然后执行删除操作。
-
而且一旦有了key对象,就不需要获取实际的模型实例了;直接在key上调用delete即可。
-
@AvinashRaj 我试图得到它,但无法让它工作。我将我尝试过的内容添加到编辑中
-
@DanielRoseman 我也尝试直接删除键。 prob_key.delete() 这也不起作用。我想我做错了..
-
@quest2graduate18 1. 传递
problem.id作为提交值,2. 查询这个id 3. 删除\
标签: python django google-app-engine