在AppEngine中删除错误的ReferenceProperty属性

时间:2008-12-14 21:45:21

标签: python google-app-engine model referenceproperty

大多数情况下,当您保存数据时,会从模型属性中获得错误。例如,如果您尝试将字符串保存为IntegerProperty,则会导致错误。

一个例外(没有双关语)是ReferenceProperty。如果你有很多引用并且你不会完全小心留下错误的引用,那么通常会遇到类似“TemplateSyntaxError:渲染时捕获异常:ReferenceProperty无法解析”的错误。

这就是视图中只有一个错误的引用。 D'哦。

我可以编写一个try / except块来尝试访问所有引用属性并在引发异常时将其删除,但是如果有一个比我更通用的方法,这个功能肯定对许多其他开发人员有用。能够写作。我想它将采用模型类型列表并尝试访问每个模型中每个实体的每个引用属性,如果引发异常则将该属性设置为None。

我会看看自己能不能做到这一点,但肯定会有一些建议/片段让我开始。

3 个答案:

答案 0 :(得分:1)

我的项目遇到了类似的困难。当我编写我的应用程序的beta版本时,我确实创建了很多死链接,并且它很难在之后解决问题。理想情况下,此工具还必须报告违规参考,以便您可以在代码中指出问题。

答案 1 :(得分:0)

你可以扩展和自定义ReferenceProperty不抛出这个异常,但是它需要返回一些东西 - 大概是None - 在这种情况下你的模板只会在它试图访问返回对象的属性时抛出异常。 / p>

更好的方法是获取referenceproperty并在呈现模板之前检查它是否有效。 ReferenceProperties缓存它们的引用,因此预取不会导致额外的数据存储调用。

答案 2 :(得分:0)

该例外实际上是一段等待修复一段时间的错误(参见http://code.google.com/p/googleappengine/issues/detail?id=426)。理想情况下,您应该能够测试引用是否有效(来自应用引擎文档):

obj1 = db.get(obj2.reference)

if not obj1:
  # Referenced entity was deleted.