Удаление ошибочных свойств ReferenceProperty в AppEngine - PullRequest
0 голосов
/ 15 декабря 2008

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 15 декабря 2008

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

0 голосов
/ 28 января 2010

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

obj1 = db.get(obj2.reference)

if not obj1:
  # Referenced entity was deleted.
0 голосов
/ 17 декабря 2008

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

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

...