本文介紹 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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。