Понимание Model.from_db() в Django
Я читал Django Official Doc for Model, там написано:
classmethod Model.from_db(db, field_names, values)¶
.Метод
from_db()может быть использован для настройки создания экземпляра модели при загрузке из базы данных.Аргумент
dbсодержит псевдоним базы данных, из которой загружается модель,field_namesсодержит имена всех загруженных полей, аvaluesсодержит загруженные значения для каждого поля вfield_names.field_namesрасположены в том же порядке, что иvalues. Если все поля модели присутствуют, тоvaluesгарантированно находятся в том порядке, в котором их ожидает__init__(). То есть экземпляр может быть создан поcls(*values). Если какие-либо поля отложены, то они не появятся вfield_names. В этом случае присвойте значениеdjango.db.models.DEFERREDкаждому из отсутствующих полей.
Я совершенно потерялся, когда читал выше.
- Первое восприятие: "при загрузке из базы данных": для меня
loadingозначает чтение/извлечение данных из базы данных, что означает, чтоmodel instanceуже существует или создан и хранится в БД. - 2-ое восприятие: "использоваться для настройки создания экземпляра модели", а также 2-й абзац заставляют меня чувствовать, что этот
from_db()предназначен дляmodel instanceсоздания, что противоречит моему 1-му восприятию.
Вопрос: Кто-нибудь может поделиться, почему, когда и как мы используем from_db() в Django?
Данные модели существуют в виде строк в БД, когда эти данные извлекаются из БД с помощью запросов, необработанные данные должны быть преобразованы в экземпляры модели, Model.from_db является методом, который выполняет это преобразование.
Первое восприятие: "при загрузке из БД": для меня загрузка означает чтение/получение данных из БД, что означает, что экземпляр модели уже существует или создан и хранится в БД.
.
Это почти правильно, модель data существует в базе данных, модель instances создается этим методом, когда эти данные запрашиваются
2-ое восприятие: "использоваться для настройки создания экземпляра модели", а также 2-й абзац заставляют меня думать, что эта функция from_db() предназначена для создания экземпляра модели, что противоречит моему 1-му восприятию.
.
Это правильно, Model.from_db предназначен для создания экземпляра и может быть переопределен для настройки этого процесса
После выполнения запроса к базе данных Django создаст объекты модели. Он делает это, вызывая метод .from_db(…) [Django-doc]. Если запрос возвращает две записи с первой записью {'id': 14, 'name': 'foo'} и второй записью {'id': 25, 'name': 'bar'}, то метод .from_db(…) будет вызван дважды с SomeModel.from_db('db-alias', ['id', 'name'], [14, 'foo']) и SomeModel.from_db('db-alias', ['id', 'name'], [25, 'bar']). Таким образом, этот метод используется для преобразования данных базы данных в объекты модели.
Если вы хотите настроить преобразование данных, полученных из базы данных, вы можете переопределить этот метод и, например, предварительно обработать данные в параметрах или пост-обработать построенный экземпляр.