<!--
譯者:Github@wizardforcel
-->
# 為模型提供初始數據 #
當你首次建立一個應用的時候,為你的數據庫預先安裝一些硬編碼的數據,是很有用處的。 有幾種方法可以讓Django自動創建這些數據:你可以通過fixtures提供初始數據,或者提供一個包含初始數據的sql文件。
通常來講,使用fixtrue更加簡潔,因為它是數據庫無關的,而使用sql初始化更加靈活。
## 提供初始數據的fixtures ##
fixture是數據的集合,讓Django了解如何導入到數據庫中。創建fixture的最直接的方式,是使用manage.py dumpdata命令,如果數據庫中已經有了一些數據。或者你可以手寫fixtures。fixtures支持JSON、XML或者YAML(需要安裝PyYAML)文檔。序列化文檔中詳細闡述了每一種所支持的序列化格式。
下面這個例子展示了一個簡單的Person 模型的fixtrue,看起來很像JSON:
```
[
{
"model": "myapp.person",
"pk": 1,
"fields": {
"first_name": "John",
"last_name": "Lennon"
}
},
{
"model": "myapp.person",
"pk": 2,
"fields": {
"first_name": "Paul",
"last_name": "McCartney"
}
}
]
```
下面是它的YAML格式:
```
- model: myapp.person
pk: 1
fields:
first_name: John
last_name: Lennon
- model: myapp.person
pk: 2
fields:
first_name: Paul
last_name: McCartney
```
你可以把這些數據儲存在你應用的fixtures目錄中。
加載數據很簡單:只要調用manage.py loaddata <fixturename>就好了,其中<fixturename>是你所創建的fixture文件的名字。每次你運行loaddata的時候,數據都會從fixture讀出,并且重復加載進數據庫。注意這意味著,如果你修改了fixtrue創建的某一行,然后再次運行了 loaddata,你的修改將會被抹掉。
## 自動加載初始數據的fixtures ##
```
1.7中廢除:
如果一個應用使用了遷移,將不會自動加載fixtures。由于Django 1.9中,遷移將會是必要的,這一行為經權衡之后被廢除。 如果你想在一個應用中加載初始數據,考慮在數據遷移中加載它們。
```
如果你創建了一個命名為 initial_data.[xml/yaml/json]的fixtrue,在你每次運行migrate命令時,fixtrue都會被加載。這非常方面,但是要注意:記住數據在你每次運行migrate命令后都會被刷新。So don’t use initial_data for data you’ll want to edit.
## Django在哪里尋找fixture文件 ##
通常,Django 在每個應用的fixtures目錄中尋找fixture文件。你可以設置FIXTURE_DIRS選項為一個額外目錄的列表,Django會從里面尋找。
運行manage.py loaddata命令的時候,你也可以指定一個fixture文件的目錄,它會覆蓋默認設置中的目錄。
> 另見
>
> fixtrues也被用于測試框架來搭建一致性的測試環境。
## 提供初始SQL數據 ##
```
1.7中廢除:
如果一個應用使用遷移,初始SQL數據將不會加載(包括后端特定的SQL數據)。由于Django 1.9中,遷移將會是必須的,這一行為經權衡后被廢除。如果你想在應用中使用初始SQL數據,考慮在數據遷移中使用它們。
```
Django為數據庫無關的SQL提供了一個鉤子,當你運行migrate命令時,CREATE TABLE語句執行之后就會執行它。你可以使用這個鉤子來建立默認的記錄,或者創建SQL函數、視圖、觸發器以及其它。
鉤子十分簡單:Django會在你應用的目錄中尋找叫做sql/<modelname>.sql的文件,其中 <modelname>是小寫的模型名稱。
所以如果在myapp應用中存在Person模型,你應該在myapp目錄的文件sql/person.sql中添加數據庫無關的SQL。下面的例子展示了文件可能會包含什么:
```
INSERT INTO myapp_person (first_name, last_name) VALUES ('John', 'Lennon');
INSERT INTO myapp_person (first_name, last_name) VALUES ('Paul', 'McCartney');
```
每個提供的SQL文件,都應該含有用于插入數據的有效的SQL語句(例如,格式適當的INSERT語句,用分號分隔)。
這些SQL文件可被manage.py中的 sqlcustom和sqlall命令閱讀。詳見manage.py文檔。
注意如果你有很多SQL數據文件,他們執行的順序是不確定的。唯一可以確定的是,在你的自定義數據文件被執行之前,所有數據表都被創建好了。
> 初始SQL數據和測試
>
> 這一技巧不能以測試目的用于提供初始數據。Django的測試框架在每次測試后都會刷新測試數據庫的內容。所以,任何使用自定義SQL鉤子添加的數據都會丟失。
>
> 如果你需要在測試用例中添加數據,你應該在測試fixture中添加它,或者在測試用例的setUp()中添加。
## 數據庫后端特定的SQL數據 ##
沒有鉤子提供給后端特定的SQL數據。例如,你有分別為PostgreSQL和SQLite準備的初始數據文件。對于每個應用,Django都會尋找叫做<app_label>/sql/<modelname>.<backend>.sql的文件,其中<app_label>是小寫的模型名稱,<modelname>是小寫的模型名稱,<backend>是你的設置文件中由ENGINE提供的模塊名稱的最后一部分(例如,如果你定義了一個數據庫,ENGINE的值為django.db.backends.sqlite3,Django會尋找<app_label>/sql/<modelname>.sqlite3.sql)。
后端特定的SQL數據會先于后端無關的SQL數據執行。例如,如果你的應用包含了sql/person.sql 和sql/person.sqlite3.sql文件,而且你已經安裝了SQLite應用,Django會首先執行 sql/person.sqlite3.sql的內容,其次才是sql/person.sql。
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第1部分:模型
- 第2部分:管理站點
- 第3部分:視圖和模板
- 第4部分:表單和通用視圖
- 第5部分:測試
- 第6部分:靜態文件
- 高級教程
- 如何編寫可重用的應用
- 為Django編寫首個補丁
- 模型層
- 模型
- 模型語法
- 元選項
- 模型類
- 查詢集
- 執行查詢
- 查找表達式
- 模型的實例
- 實例方法
- 訪問關聯對象
- 遷移
- 模式編輯器
- 編寫遷移
- 高級
- 管理器
- 原始的SQL查詢
- 聚合
- 多數據庫
- 自定義查找
- 條件表達式
- 數據庫函數
- 其它
- 遺留的數據庫
- 提供初始數據
- 優化數據庫訪問
- 視圖層
- 基礎
- URL配置
- 視圖函數
- 快捷函數
- 裝飾器
- 參考
- 內建的視圖
- TemplateResponse 對象
- 文件上傳
- 概覽
- File 對象
- 儲存API
- 管理文件
- 自定義存儲
- 基于類的視圖
- 概覽
- 內建顯示視圖
- 內建編輯視圖
- API參考
- 分類索引
- 高級
- 生成 CSV
- 生成 PDF
- 中間件
- 概覽
- 內建的中間件類
- 模板層
- 基礎
- 面向設計師
- 語言概覽
- 人性化
- 面向程序員
- 表單
- 基礎
- 概覽
- 表單API
- 內建的Widget
- 高級
- 整合媒體
- 開發過程
- 設置
- 概覽
- 應用程序
- 異常
- 概覽
- django-admin 和 manage.py
- 添加自定義的命令
- 測試
- 介紹
- 部署
- 概述
- WSGI服務器
- 部署靜態文件
- 通過email追蹤代碼錯誤
- Admin
- 管理操作
- 管理文檔生成器
- 安全
- 安全概述
- 說明Django中的安全問題
- 點擊劫持保護
- 加密簽名
- 國際化和本地化
- 概述
- 本地化WEB UI格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架