Необходим ли пользовательский подкласс ForeignKey, если Django ORM должен работать с неверными значениями PK? - PullRequest
2 голосов
/ 11 марта 2011

Проект, над которым я работаю, содержит грязные данные в базе данных. По сути, оригинальный дизайнер создавал поля внешнего ключа, но не применял к ним ссылочную целостность. Теперь есть значения 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, и я ищу пример того, как с этим справиться. Или, возможно, есть лучший способ, который кто-то может порекомендовать.

1 Ответ

1 голос
/ 12 марта 2011

Я думаю, что должны быть лучшие возможности для решения этой проблемы, поскольку ваше решение по-прежнему не обеспечивает целостности вашей базы данных. Возможности будут:

  • Измените свою модель: установите параметры FK на null=True и измените нули на None
  • Установите все FK с '0' на другое значение и создайте связанный 'фиктивный объект', представляющий 'удаленные' объекты

Бесшумный сбой (всех) исключений может доставить вам много хлопот, так как вы можете столкнуться с другими проблемами, даже не зная об этом ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...