gpt4 book ai didi

python - 如何删除通过 Appengine 中的 Key 属性连接的实体连接的所有实体

转载 作者:行者123 更新时间:2023-12-01 02:42:29 25 4
gpt4 key购买 nike

我有以下数据存储模型。

class UserDetail(ndb.Model):
name=ndb.StringProperty(required=True)
password=ndb.StringProperty(required=True)
email=ndb.StringProperty(required=False)
posts=ndb.KeyProperty(kind='Post',repeated=True)

class Post(ndb.Model):
subject=ndb.StringProperty(required=True)
content=ndb.TextProperty(required=True)
created=ndb.DateTimeProperty(auto_now_add=True)
user=ndb.KeyProperty(kind='UserDetail')
comments=ndb.KeyProperty(kind='Comment',repeated=True)

class Comment(ndb.Model):
body=ndb.StringProperty(required=True)
user=ndb.KeyProperty(kind='UserDetail')
post=ndb.KeyProperty(kind='Post')

基本上我想做的是删除帖子。当我删除帖子时,它的所有评论都应该被删除,并且帖子也应该从 UserDetail 模型的用户帖子列表中删除。我知道删除的方法是删除帖子并搜索具有给定帖子 ID 的评论模型并删除所有帖子,并以同样的方式转到用户的帖子列表并删除所需的帖子。有没有更好的办法。

最佳答案

最好的方法是定义一个pre_delete_hook。这是删除实体之前运行的函数。让这个函数本身删除任何引用这篇文章的评论。您还可以让它从 UserDetails 中删除键值。代码将是这样的:

class Post(ndb.Model):
...
@classmethod
def _pre_delete_hook(cls, key):
comments = Comment.query(Comment.post==key).fetch(keys_only=True)
ndb.delete_multi(comments)

details = UserDetail.query(UserDetail.posts.IN([key])).fetch()
for detail in details:
detail.posts.remove(key)
ndb.put_multi(details)

您应该使用钩子(Hook)的原因是这样可以保证无论代码的哪一部分尝试删除Post,您想要的函数都会被执行。这是一种补偿您没有使用关系数据库这一事实的方法。

您可以在documentation中找到有关钩子(Hook)的更多详细信息。 。我希望这有帮助!

关于python - 如何删除通过 Appengine 中的 Key 属性连接的实体连接的所有实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45532347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com