Проект, над которым я работаю, содержит грязные данные в базе данных. По сути, оригинальный дизайнер создавал поля внешнего ключа, но не применял к ним ссылочную целостность. Теперь есть значения FK, которые являются недопустимыми и фактически не указывают на существующие записи. Обычно я просто удаляю эти недопустимые значения FK, но приложение, которое находится на этой базе данных, дополнительно использует буквенный номер 0, хранящийся в этих полях FK, для указания другой информации. На самом деле нет записи с первичным ключом = 0.
Я обернул этот некорректный дизайн таблицы в классы ORM Django и поля ForeignKey, но он, что не случайно, вызывает много исключений DoesNotExist, когда он не может найти запись на другом конце поля ForeignKey. Я пытался найти способ, как раз для этого проекта, спокойно перехватить это исключение, вместо того, чтобы засорять мой код блоками try / кроме везде, где это исключение может быть сгенерировано. В этом случае я просто хочу предотвратить появление ошибки в Django ORM.
Я пытаюсь сделать это с помощью собственного менеджера, переопределив метод get () и используя атрибут класса use_for_related_field = True. Метод get () пользовательского менеджера явно не используется, хотя в случае, когда ForeignKey имеет недопустимое значение ключа.
class FWManager(models.Manager):
"""
FW's data is "dirty". Primarily it isn't enforcing referential integrity on
many of it's foreign key fields leading to oprphaned records. Django throws a
DoesNotExist exception in this case which is troublesome having to catch it for
any fk field access.
Custom FWManager will silently "eat" the DoesNotExist error and return None
instead.
"""
use_for_related_fields=True
def get(self, *args, **kwargs):
#init
retval = None
try:
retval = super(FWManager, self).get(*args, **kwargs)
except:
# silently eat errors
pass
return retval
Мне нужен способ отловить и устранить ошибку DoesNotExist на потенциально пользовательском ForeignKey, и я ищу пример того, как с этим справиться. Или, возможно, есть лучший способ, который кто-то может порекомендовать.