Django 文檔協(xié)作翻譯小組人手緊缺界赔,有興趣的朋友可以加入我們谤牡,完全公益性質。
交流群:467338606
為模型提供初始數(shù)據(jù)
當你首次建立一個應用的時候葱绒,為你的數(shù)據(jù)庫預先安裝一些硬編碼的數(shù)據(jù)谬以,是很有用處的。 有幾種方法可以讓Django自動創(chuàng)建這些數(shù)據(jù):你可以通過fixtures提供初始數(shù)據(jù)圆雁,或者提供一個包含初始數(shù)據(jù)的sql文件忍级。
通常來講,使用fixtrue更加簡潔伪朽,因為它是數(shù)據(jù)庫無關的轴咱,而使用sql初始化更加靈活。
提供初始數(shù)據(jù)的fixtures
fixture是數(shù)據(jù)的集合烈涮,讓Django了解如何導入到數(shù)據(jù)庫中朴肺。創(chuàng)建fixture的最直接的方式,是使用manage.py dumpdata命令坚洽,如果數(shù)據(jù)庫中已經有了一些數(shù)據(jù)戈稿。或者你可以手寫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
你可以把這些數(shù)據(jù)儲存在你應用的fixtures目錄中肋乍。
加載數(shù)據(jù)很簡單:只要調用manage.py loaddata <fixturename>就好了,其中<fixturename>是你所創(chuàng)建的fixture文件的名字敷存。每次你運行l(wèi)oaddata的時候墓造,數(shù)據(jù)都會從fixture讀出,并且重復加載進數(shù)據(jù)庫历帚。注意這意味著滔岳,如果你修改了fixtrue創(chuàng)建的某一行,然后再次運行了 loaddata挽牢,你的修改將會被抹掉谱煤。
自動加載初始數(shù)據(jù)的fixtures
1.7中廢除:
如果一個應用使用了遷移,將不會自動加載fixtures禽拔。由于Django 1.9中刘离,遷移將會是必要的,這一行為經權衡之后被廢除睹栖。 如果你想在一個應用中加載初始數(shù)據(jù)硫惕,考慮在數(shù)據(jù)遷移中加載它們。
如果你創(chuàng)建了一個命名為 initial_data.[xml/yaml/json]的fixtrue野来,在你每次運行migrate命令時恼除,fixtrue都會被加載。這非常方面曼氛,但是要注意:記住數(shù)據(jù)在你每次運行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也被用于測試框架來搭建一致性的測試環(huán)境低匙。
提供初始SQL數(shù)據(jù)
1.7中廢除:
如果一個應用使用遷移旷痕,初始SQL數(shù)據(jù)將不會加載(包括后端特定的SQL數(shù)據(jù))。由于Django 1.9中努咐,遷移將會是必須的苦蒿,這一行為經權衡后被廢除。如果你想在應用中使用初始SQL數(shù)據(jù)渗稍,考慮在數(shù)據(jù)遷移中使用它們佩迟。
Django為數(shù)據(jù)庫無關的SQL提供了一個鉤子团滥,當你運行migrate命令時,CREATE TABLE語句執(zhí)行之后就會執(zhí)行它报强。你可以使用這個鉤子來建立默認的記錄灸姊,或者創(chuàng)建SQL函數(shù)、視圖秉溉、觸發(fā)器以及其它力惯。
鉤子十分簡單:Django會在你應用的目錄中尋找叫做sql/<modelname>.sql的文件,其中 <modelname>是小寫的模型名稱召嘶。
所以如果在myapp應用中存在Person模型父晶,你應該在myapp目錄的文件sql/person.sql中添加數(shù)據(jù)庫無關的SQL。下面的例子展示了文件可能會包含什么:
INSERT INTO myapp_person (first_name, last_name) VALUES ('John', 'Lennon');
INSERT INTO myapp_person (first_name, last_name) VALUES ('Paul', 'McCartney');
每個提供的SQL文件弄跌,都應該含有用于插入數(shù)據(jù)的有效的SQL語句(例如甲喝,格式適當?shù)腎NSERT語句,用分號分隔)铛只。
這些SQL文件可被manage.py中的 sqlcustom和sqlall命令閱讀埠胖。詳見manage.py文檔。
注意如果你有很多SQL數(shù)據(jù)文件淳玩,他們執(zhí)行的順序是不確定的直撤。唯一可以確定的是,在你的自定義數(shù)據(jù)文件被執(zhí)行之前蜕着,所有數(shù)據(jù)表都被創(chuàng)建好了谋竖。
初始SQL數(shù)據(jù)和測試
這一技巧不能以測試目的用于提供初始數(shù)據(jù)。Django的測試框架在每次測試后都會刷新測試數(shù)據(jù)庫的內容承匣。所以圈盔,任何使用自定義SQL鉤子添加的數(shù)據(jù)都會丟失。
如果你需要在測試用例中添加數(shù)據(jù)悄雅,你應該在測試fixture中添加它,或者在測試用例的setUp()中添加铁蹈。
數(shù)據(jù)庫后端特定的SQL數(shù)據(jù)
沒有鉤子提供給后端特定的SQL數(shù)據(jù)宽闲。例如,你有分別為PostgreSQL和SQLite準備的初始數(shù)據(jù)文件握牧。對于每個應用容诬,Django都會尋找叫做<app_label>/sql/<modelname>.<backend>.sql的文件,其中<app_label>是小寫的模型名稱沿腰,<modelname>是小寫的模型名稱览徒,<backend>是你的設置文件中由ENGINE提供的模塊名稱的最后一部分(例如,如果你定義了一個數(shù)據(jù)庫颂龙,ENGINE的值為django.db.backends.sqlite3习蓬,Django會尋找<app_label>/sql/<modelname>.sqlite3.sql)纽什。
后端特定的SQL數(shù)據(jù)會先于后端無關的SQL數(shù)據(jù)執(zhí)行。例如躲叼,如果你的應用包含了sql/person.sql 和sql/person.sqlite3.sql文件芦缰,而且你已經安裝了SQLite應用,Django會首先執(zhí)行 sql/person.sqlite3.sql的內容枫慷,其次才是sql/person.sql让蕾。