Удаление ошибочных свойств ReferenceProperty в AppEngine

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

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

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

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

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


person jamtoday    schedule 14.12.2008    source источник


Ответы (3)


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

person Community    schedule 15.12.2008

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

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

person Nick Johnson    schedule 17.12.2008

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

obj1 = db.get(obj2.reference)

if not obj1:
  # Referenced entity was deleted.
person Mehmet    schedule 28.01.2010