谷歌应用程序引擎 - 如何删除单个实体,你在python中有该实体的ID

时间:2014-07-28 10:06:28

标签: python-2.7 google-cloud-datastore gql

我正在使用GAE构建博客。我想使用ID密钥删除存储在数据存储区中的特定帖子。我的代码是..

#my db model
class Post(db.Model):
subject = db.StringProperty(required = True)
content = db.TextProperty(required = True)
created = db.DateTimeProperty(auto_now_add = True)
lastmodified = db.DateTimeProperty(auto_now = True)

#my delete post handler
class DeletePost(Bloghandler):
    def post(self):
        key = self.request.get('id')

#my html form which passes the ID of the entity.
<form method="post" class="button-link" action="http://localhost:8080/blog/delete">
<input type="hidden" name="id" value={{p.Key().id()}}>
<input type="submit" name="delete" value="Delete">
</form><br><br>

有一个类似的帖子来删除涉及blobstore的实体,这使我很难遵循和实施。任何帮助将不胜感激!:)

2 个答案:

答案 0 :(得分:2)

db.delete(键)

除此之外,我真的不明白你的问题。如果你有密钥,你只需使用所述密钥

调用db.delete

你还需要什么(如果我不清楚你在问什么)?

答案 1 :(得分:1)

无需从Datastore实际获取实体以删除它。由于您拥有密钥的ID,因此您可以使用Key.from_path

手动构建密钥
class DeletePost(Bloghandler):
  def post(self):
    key_id = self.request.get('id')
    db.delete(db.Key.from_path('Post', key_id))

请注意,如果您在密钥中添加父密钥,则此提议和其他建议的解决方案不会出现,这在您开始考虑一致性模型时可能很重要。

相反,您应该使用密钥的序列化版本:

class DeletePost(Bloghandler):
    def post(self):
        key = db.Key(encoded=self.request.get('id'))
        db.delete(key)

<form method="post" class="button-link" action="http://localhost:8080/blog/delete">
<input type="hidden" name="id" value={{p.key()}}>
<input type="submit" name="delete" value="Delete">
</form><br><br>

正如here所述,在str()上使用db.Key将返回密钥的urlsafe字符串编码,然后由Key构造函数读取。