2008-12-14 3 views
0

В большинстве случаев ошибки, возникающие из свойств вашей модели, будут выполняться при сохранении данных. Например, если вы попытаетесь сохранить строку как IntegerProperty, это приведет к ошибке.Удаление ошибочных свойств ReferenceProperty в AppEngine

Единственное исключение (без каламбура) - ReferenceProperty. Если у вас много ссылок, и вы не совсем осторожны с тем, чтобы оставить их в плохих ссылках, обычно встречается с ошибкой типа «TemplateSyntaxError: вызывается исключение при рендеринге: ReferenceProperty не удалось разрешить».

И это, если в представлении есть только одна плохая ссылка. D'о.

Я мог бы написать блок try/except, чтобы попытаться получить доступ ко всем свойствам ссылки и удалить их, если возникло исключение, но эта функциональность может быть полезна многим другим разработчикам, если существует более общий метод, чем один Я был бы способен писать. Я предполагаю, что для этого потребуется список типов моделей и попытаться получить доступ к каждому ссылочному свойству каждого объекта в каждой модели, установив свойство None, если возникло исключение.

Я посмотрю, смогу ли я сделать это сам, но это определенно поможет иметь некоторые предложения/фрагменты, чтобы начать меня.

ответ

1

У меня схожие трудности для моего проекта. Когда я кодирую бета-версию своего приложения, я создаю много мертвой ссылки, и ее trully боль, чтобы распутать вещи после этого. В идеале, этот инструмент должен также сообщать о нарушении, чтобы вы могли столкнуться с проблемами в коде.

0

Вы можете расширить и настроить ReferenceProperty, чтобы не выбрасывать это исключение, но тогда ему нужно будет что-то вернуть - предположительно None - в этом случае ваш шаблон будет просто генерировать исключение, когда он попытается получить доступ к свойствам возвращаемого объекта.

Лучшим подходом является выбор referenceproperty и проверка его правильности перед визуализацией шаблона. ReferenceProperties кэширует свои ссылки, поэтому предварительная выборка не приведет к дополнительным вызовам хранилища данных.

0

Это исключение на самом деле является ошибкой, которая долгое время была исправлена ​​(см. http://code.google.com/p/googleappengine/issues/detail?id=426). В идеале вы должны проверить, действительно ли эта ссылка действительна (из документации по модулю приложения):

obj1 = db.get(obj2.reference) 

if not obj1: 
    # Referenced entity was deleted. 

 Смежные вопросы

  • Нет связанных вопросов^_^