【问题标题】:Deleting erroneous ReferenceProperty properties in AppEngine在 AppEngine 中删除错误的 ReferenceProperty 属性
【发布时间】:2008-12-14 21:45:21
【问题描述】:

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

一个例外(没有双关语)是 ReferenceProperty。如果您有很多引用并且您没有完全小心留下错误的引用,那么通常会遇到类似“TemplateSyntaxError: Caught an exception while rendering: ReferenceProperty failed to be resolve”之类的错误。

这是如果视图中只有一个错误的引用。哦。

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

我会看看我自己能不能做到这一点,但如果有一些建议/sn-ps 帮助我开始,肯定会有所帮助。

【问题讨论】:

    标签: python google-app-engine model referenceproperty


    【解决方案1】:

    我的项目也遇到了类似的困难。当我编写我的应用程序的 beta 版本时,我确实创建了很多死链接,之后理清事情真的很痛苦。理想情况下,此工具还必须报告有问题的引用,以便您可以查明代码中的问题。

    【讨论】:

      【解决方案2】:

      您可以扩展和自定义 ReferenceProperty 以不引发此异常,但随后它需要返回一些东西 - 可能是 None - 在这种情况下,当您的模板尝试访问返回对象的属性时,它只会抛出一个异常。

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

      【讨论】:

        【解决方案3】:

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

        obj1 = db.get(obj2.reference)
        
        if not obj1:
          # Referenced entity was deleted.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-25
          • 1970-01-01
          • 1970-01-01
          • 2016-10-25
          • 2015-12-02
          • 1970-01-01
          相关资源
          最近更新 更多