本文介绍 django.db.models.Model.from_db
的用法。
声明
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
的值分配给每个缺失的字段。
除了创建新模型之外,from_db()
方法还必须在新实例的
属性中设置 _state
adding
和 db
标志。
下面是一个示例,显示如何记录从数据库加载的字段的初始值:
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()
调用。
相关用法
- Python Django Model.__eq__用法及代码示例
- Python Django Model.__str__用法及代码示例
- Python Django Model.get_absolute_url用法及代码示例
- Python Django Model.objects用法及代码示例
- Python Django ModelAdmin.get_changeform_initial_data用法及代码示例
- Python Django ModelAdmin.get_formset_kwargs用法及代码示例
- Python Django ModelAdmin.get_urls用法及代码示例
- Python Django ModelAdmin.formfield_for_choice_field用法及代码示例
- Python Django ModelAdmin.readonly_fields用法及代码示例
- Python Django ModelAdmin.prepopulated_fields用法及代码示例
- Python Django ModelAdmin.empty_value_display用法及代码示例
- Python Django ModelAdmin.get_form用法及代码示例
- Python Django ModelChoiceField.iterator用法及代码示例
- Python Django ModelAdmin.formfield_for_foreignkey用法及代码示例
- Python Django ModelAdmin.get_search_results用法及代码示例
- Python Django ModelAdmin.autocomplete_fields用法及代码示例
- Python Django ModelAdmin.date_hierarchy用法及代码示例
- Python Django ModelAdmin.get_formsets_with_inlines用法及代码示例
- Python Django ModelAdmin.save_model用法及代码示例
- Python Django ModelAdmin.view_on_site用法及代码示例
- Python Django ModelChoiceField.empty_label用法及代码示例
- Python Django ModelAdmin.get_inline_instances用法及代码示例
- Python Django ModelAdmin.formfield_overrides用法及代码示例
- Python Django ModelAdmin.get_changelist_formset用法及代码示例
- Python Django ModelAdmin.get_sortable_by用法及代码示例
注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.Model.from_db。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。