當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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