Django: переопределение to_python () для поля ForeignKey и какие другие методы вызываются перед clean_ <fieldname>при проверке формы? - PullRequest
1 голос
/ 29 января 2010

Я пытаюсь решить проблему, которую изложил в этот вопрос . На данный момент похоже, что мне придется переопределить метод to_python () в поле ForeignKey. Но, насколько я вижу в исходном коде django, класс ForeignKey на самом деле не имеет объявленного метода to_python (), поэтому он должен наследовать его от класса Field, что означает, что он выглядит так:

def to_python(self, value):
        """
        Converts the input value into the expected Python data type, raising
        django.core.exceptions.ValidationError if the data can't be converted.
        Returns the converted value. Subclasses should override this.
        """
        return value

Только это не может быть правильным ... Это означает, что он не генерирует ошибку ValidationError. И все же, безусловно, что-то должно быть выброшено ... Я имею в виду, что преобразование идентификатора в объект должно происходить где-то, и, конечно, если идентификатор был неверным, выдается ValidationError? Или, возможно, правильный вопрос - какие другие методы вызываются перед методом clean_ <fieldname> () в форме? Какие из них я могу переопределить?

1 Ответ

1 голос
/ 30 января 2010

to_python используется для преобразования элемента из значения базы данных в значение Python, в тех случаях, когда типы различаются.Но поле внешнего ключа на самом деле представляет собой целое число - идентификатор связанного объекта.Таким образом, нет необходимости в преобразовании, следовательно, пустой метод.Фактическое получение / отображение связанного объекта осуществляется через дескриптор.

Однако я не знаю, почему вы думаете, что вам нужно переопределить to_python для ForeignKey.Это не имеет ничего общего с проблемой, которую вы упоминаете в связанном вопросе, то есть с необходимостью создать объект перед установкой ссылки на него.Это лучше всего сделать чистым методом формы, и я добавлю туда ответ.

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