当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django Model.from_db用法及代码示例


本文介绍 django.db.models.Model.from_db 的用法。

声明

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 的值分配给每个缺失的字段。

除了创建新模型之外,from_db() 方法还必须在新实例的 _state 属性中设置 addingdb 标志。

下面是一个示例,显示如何记录从数据库加载的字段的初始值:

from django.db.models import DEFERRED

@classmethod
def from_db(cls, db, field_names, values):
    # Default implementation of from_db() (subject to change and could
    # be replaced with super()).
    if len(values) != len(cls._meta.concrete_fields):
        values = list(values)
        values.reverse()
        values = [
            values.pop() if f.attname in field_names else DEFERRED
            for f in cls._meta.concrete_fields
        ]
    instance = cls(*values)
    instance._state.adding = False
    instance._state.db = db
    # customization to store the original field values on the instance
    instance._loaded_values = dict(
        zip(field_names, (value for value in values if value is not DEFERRED))
    )
    return instance

def save(self, *args, **kwargs):
    # Check how the current values differ from ._loaded_values. For example,
    # prevent changing the creator_id of the model. (This example doesn't
    # support cases where 'creator_id' is deferred).
    if not self._state.adding and (
            self.creator_id != self._loaded_values['creator_id']):
        raise ValueError("Updating the value of creator isn't allowed")
    super().save(*args, **kwargs)

上面的示例显示了一个完整的 from_db() 实现,以阐明它是如何完成的。在这种情况下,可以在from_db() 方法中使用super() 调用。

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.Model.from_db。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。