當你首次創建一個應用的時候,爲你的數據庫預先安裝一些硬編碼的數據,是頗有用處的。 有幾種方法可讓Django自動建立這些數據:你能夠經過fixtures提供初始數據,或者提供一個包含初始數據的sql文件。html
一般來說,使用fixtrue更加簡潔,由於它是數據庫無關的,而使用sql初始化更加靈活。python
fixture是數據的集合,讓Django瞭解如何導入到數據庫中。建立fixture的最直接的方式,是使用manage.py dumpdata命令,若是數據庫中已經有了一些數據。或者你能夠手寫fixtures。fixtures支持JSON、XML或者YAML(須要安裝PyYAML)文檔。序列化文檔中詳細闡述了每一種所支持的序列化格式。git
下面這個例子展現了一個簡單的Person 模型的fixtrue,看起來很像JSON:github
[ { "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格式:sql
- 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,你的修改將會被抹掉。django
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.json
一般,Django 在每一個應用的fixtures目錄中尋找fixture文件。你能夠設置FIXTURE_DIRS選項爲一個額外目錄的列表,Django會從裏面尋找。後端
運行manage.py loaddata命令的時候,你也能夠指定一個fixture文件的目錄,它會覆蓋默認設置中的目錄。app
另見
fixtrues也被用於測試框架來搭建一致性的測試環境。
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數據。例如,你有分別爲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。
譯者:飛龍,原文:Providing initial data。
本文以 CC BY-NC-SA 3.0 協議發佈,轉載請保留做者署名和文章出處。
Django 文檔協做翻譯小組人手緊缺,有興趣的朋友能夠加入咱們,徹底公益性質。交流羣:467338606。
若是以爲文章還不錯,能夠掃描下面的二維碼來打賞我。