django 1.8 官方文檔翻譯: 2-6-3 提供初始數(shù)據(jù)

Django 文檔協(xié)作翻譯小組人手緊缺界赔,有興趣的朋友可以加入我們谤牡,完全公益性質。

交流群:467338606

網站:http://python.usyiyi.cn/django/index.html

為模型提供初始數(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让蕾。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市或听,隨后出現(xiàn)的幾起案子探孝,更是在濱河造成了極大的恐慌,老刑警劉巖誉裆,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顿颅,死亡現(xiàn)場離奇詭異,居然都是意外死亡找御,警方通過查閱死者的電腦和手機元镀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霎桅,“玉大人栖疑,你說我怎么就攤上這事√鲜唬” “怎么了遇革?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長揭糕。 經常有香客問我萝快,道長,這世上最難降的妖魔是什么著角? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任揪漩,我火速辦了婚禮,結果婚禮上吏口,老公的妹妹穿的比我還像新娘奄容。我一直安慰自己,他們只是感情好产徊,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布昂勒。 她就那樣靜靜地躺著,像睡著了一般舟铜。 火紅的嫁衣襯著肌膚如雪戈盈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天谆刨,我揣著相機與錄音塘娶,去河邊找鬼归斤。 笑死,一個胖子當著我的面吹牛血柳,可吹牛的內容都是我干的官册。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼难捌,長吁一口氣:“原來是場噩夢啊……” “哼膝宁!你這毒婦竟也來了?” 一聲冷哼從身側響起根吁,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤员淫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后击敌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體介返,經...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年沃斤,在試婚紗的時候發(fā)現(xiàn)自己被綠了圣蝎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衡瓶,死狀恐怖徘公,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情哮针,我是刑警寧澤关面,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站十厢,受9級特大地震影響等太,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蛮放,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一缩抡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧包颁,春花似錦缝其、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榴都。三九已至待锈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘴高,已是汗流浹背竿音。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工和屎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人春瞬。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓柴信,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宽气。 傳聞我的和親對象是個殘疾皇子随常,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容