googleappengin中的递归删除

2024-04-30 07:12:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用googleappengine和django 1.0.2(以及django助手),想知道人们是如何进行递归删除的。 假设你有这样一个模型:

class Top(BaseModel):
    pass

class Bottom(BaseModel):
    daddy = db.ReferenceProperty(Top)

现在,当我删除“Top”类型的对象时,我希望所有关联的“Bottom”对象也被删除。在

现在的情况是,当我删除一个“Top”对象时,“Bottom”对象会保留下来,然后我会得到不属于任何地方的数据。当访问视图中的数据存储时,我的结果是:

^{pr2}$

我当然可以找到所有的对象并删除它们,但由于我的真实模型至少有5层深,我希望有一种方法可以确保这可以自动完成。在

我发现这个article是关于它如何与Java一起工作的,这似乎也是我想要的。在

有人知道我怎么在django也有这种行为吗?在


Tags: 数据对象django模型类型dbtop助手
3条回答

实际上这种行为是GAE特有的。Django的ORM在.DELETE()上模拟“ON DELETE CASCADE”。在

我知道这不是你问题的答案,但也许它能帮助你避免找错地方。在

您需要手动执行此操作,方法是查找受影响的记录,并在删除父记录的同时删除它们。如果您愿意,可以通过重写父类上的.delete()方法来自动删除所有相关记录来简化这一过程。在

出于性能原因,您几乎肯定希望使用仅限键查询(允许您获取要删除的实体的键,而不必获取和解码实际实体)和批删除。例如:

db.delete(Bottom.all(keys_only=True).filter("daddy =", top).fetch(1000))

重新考虑数据结构。如果这种关系在记录的生命周期内永远不会改变,您可以使用GAE的“祖先”功能:

class Top(db.Model): pass
class Middle(db.Model): pass
class Bottom(db.Model): pass

top = Top()
middles = [Middle(parent=top) for i in range(0,10)]
bottoms = [Bottom(parent=middle) for i in range(0,10) for middle in middles]

然后查询祖先=top将找到所有级别的所有记录。所以很容易删除它们。在

^{pr2}$

相关问题 更多 >