我正在阅读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
已经存在或创建并存储在DB中。 - 第二个感知:“用于自定义模型示例创建”,以及第2段都让我觉得这个
from_db()
是用于model instance
创建的,这与我的第一个认知有冲突。
Q:有人能分享一下为什么,何时以及如何在Django中使用from_db()
吗?
2条答案
按热度按时间mgdq6dx11#
在进行数据库查询后,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'])
。因此,该方法用于在模型对象中 * 转换 * 数据库数据。因此,如果您希望自定义如何转换从数据库检索的数据,则可以重写该方法,例如预处理参数中的数据,或后处理构造的示例。
50pmv0ei2#
模型数据以行的形式存在于数据库中,当通过查询从数据库中检索这些数据时,必须将原始数据转换为模型示例,
Model.from_db
是执行此转换的方法。第一感知:“从数据库加载时”:对我来说,加载意味着从数据库中阅读/检索数据,这意味着模型示例已经存在或创建并存储在DB中。
这几乎是正确的,模型数据存在于数据库中,模型示例在查询该数据时通过此方法创建
第二个感知:“用于自定义模型示例创建”,以及第2段都让我觉得这from_db()是用于模型示例创建的,这与我的第1个认知相冲突。
这是正确的,
Model.from_db
是用于示例创建的,并且可以被覆盖以自定义该过程