了解Django中的Model.from_db()

zed5wv10  于 2023-07-01  发布在  Go
关注(0)|答案(2)|浏览(118)

我正在阅读Django Official Doc for Model,它写道:

classmethod Model.from_db(db,field_names,values)¶

from_db()方法可用于在从数据库加载时自定义模型示例的创建。
db参数包含从中加载模型的数据库的数据库别名,field_names包含所有加载字段的名称,values包含field_names中每个字段的加载值。field_namesvalues的顺序相同。如果模型的所有字段都存在,那么values保证按照__init__()期望的顺序排列。也就是说,该示例可以由cls(*values)创建。如果任何字段被延迟,它们将不会出现在field_names中。在这种情况下,为每个缺失字段分配值django.db.models.DEFERRED
阅读上面的内容时,我完全迷失了。

  • 第一感知:**“从数据库加载时”:**对我来说,loading表示从数据库阅读/检索数据,这意味着model instance已经存在或创建并存储在DB中。
  • 第二个感知:“用于自定义模型示例创建”,以及第2段都让我觉得这个from_db()是用于model instance创建的,这与我的第一个认知有冲突。
    Q:有人能分享一下为什么,何时以及如何在Django中使用from_db()吗?
mgdq6dx1

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'])。因此,该方法用于在模型对象中 * 转换 * 数据库数据。
因此,如果您希望自定义如何转换从数据库检索的数据,则可以重写该方法,例如预处理参数中的数据,或后处理构造的示例。

50pmv0ei

50pmv0ei2#

模型数据以行的形式存在于数据库中,当通过查询从数据库中检索这些数据时,必须将原始数据转换为模型示例,Model.from_db是执行此转换的方法。
第一感知:“从数据库加载时”:对我来说,加载意味着从数据库中阅读/检索数据,这意味着模型示例已经存在或创建并存储在DB中。
这几乎是正确的,模型数据存在于数据库中,模型示例在查询该数据时通过此方法创建
第二个感知:“用于自定义模型示例创建”,以及第2段都让我觉得这from_db()是用于模型示例创建的,这与我的第1个认知相冲突。
这是正确的,Model.from_db是用于示例创建的,并且可以被覆盖以自定义该过程

相关问题