【问题标题】:GAE - Trouble Deleting Entity from keyGAE - 无法从密钥中删除实体
【发布时间】: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


【解决方案1】:

您不能通过 HTML 页面传递密钥对象本身,但可以传递其 .urlsafe() 字符串表示形式。

所以在您的 HTML 中显示字符串表示,如下所示:

value="{{ problem.key.urlsafe() }}"

并在您的处理程序代码中从其字符串表示中恢复密钥:

prob_key = ndb.Key(urlsafe=self.request.get('problem_key'))

来自Retrieving Entities from Keys

您还可以使用实体的密钥来获取适合的编码字符串 用于嵌入 URL:

url_string = sandy_key.urlsafe()

这会产生类似agVoZWxsb3IPCxIHQWNjb3VudBiZiwIM 的结果 稍后可用于重建密钥并检索原始密钥 实体:

sandy_key = ndb.Key(urlsafe=url_string)
sandy = sandy_key.get()

【讨论】:

  • 我现在遇到模板语法错误。我不知道这是否与它有关,但我正在使用 webapp2。编辑我的问题的管理员用 Django 标记了它。
  • 可能是因为试图在模板本身中调用urlsafe(),我只是假设它会像这样工作,基于stackoverflow.com/questions/5190204/…。也可以试试problem.key.urlsafe(如果这确实是一个 django 模板)。就个人而言,我不在模板中调用对象方法,而是在处理程序代码中执行此操作,我可以在将结果传递给模板之前对其进行清理。你也可以这样做,比如在problem 的类中添加@property,返回self.key.urlsafe()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2020-04-11
  • 2015-09-21
  • 1970-01-01
相关资源
最近更新 更多