Понимание 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'])
. Таким образом, этот метод используется для преобразования данных базы данных в объекты модели.
Если вы хотите настроить преобразование данных, полученных из базы данных, вы можете переопределить этот метод и, например, предварительно обработать данные в параметрах или пост-обработать построенный экземпляр.