本節內容我們將配置數據庫,創建第一個model並且快速了解Django自動生成的管理后台(admin site)
目錄
數據庫配置
打開上一節中新建的項目的配置文件,它是一個普通的python模塊。
默認情況下,數據庫配置使用SQLite,如果你數據庫的新手,或者你僅僅是對Django感興趣,這是最好的選擇。SQLite包含在Python,所以不需要安裝任何東西。當你開始你的第一個真正的項目的時候,你可能想
要使用更強大的數據庫如PostgreSQL,去避免切換數據庫的痛苦。
如果你希望使用另外一個數據庫,需要安裝對應的數據庫驅動並且修改鍵DATABASES的'default'項為匹配的數據庫連接設置:
- ENGINE - 'django.db.backends.sqlite3','django.db.backends.postgresql','django.db.backends.mysql',或者'django.db.backends.oracle', 還有其他的后端引擎。
- NAME - 數據庫名稱,如果你使用SQLite,設置為你的數據庫文件所在的路徑;這種情況下NAME是一個完整的絕對路徑,包含文件名,默認值為:os.path.join(BASE_DIR, 'db.sqlite3'),這個文件將存放在你項目所在的目錄。
如果你不使用SQLite作為你的數據庫,那么需要另外的設置如:USER,PASSWORD,和HOST必須要添加。關於databases的詳細配置我們將單獨講解。
對於SQLite以外的數據庫
如果你使用SQLite以外的數據庫,請確保你已經創建了一個數據庫,也要確保在mysite/settings.py中提供的用戶具有“創建數據庫”的權限,允許自動創建一個測試數據庫在后面的教程中將會用。如果你使用SQLite不需要做任何事情,數據庫文件將會在你需要的時候自動創建。
另外,注意在mysite/settings.py文件的頂部INSTALLED_APPS設置,里面包含當前項目中所有被激活的Django應用的名稱。應用可以在多個項目中使用,你可以打包並分發給其他的項目使用。
默認情況下,INSTALLED_APPS包含如下應用:
- django.contrib.admin - 一個管理后台。下面很快將會用到它
- django.contrib.auth - 一個認證系統。
- django.contrib.contenttypes - 一個文檔內容類型的框架
- django.contrib.sessions - 一個session框架
- django.contrib.messages - 一個消息框架
這些應用至少使用數據庫中的一個表,雖然如此,在我們使用它們之前我們需要在一個數據庫里面創建表,可以運行下面的命令做到它:
$ python manage.py migrate
migrate命令將查找INSTALLED_APPS的設置,並且創建符合你在mysite/settings.py文件中配置的數據庫的任何有必要的數據庫表並且隨應用遷移,如果說INSTALLED_APPS里面的應用不需要的話那么在運行migrate之前把它注釋或刪除掉即可。
創建模型
現在我們定義模型,在我們創建的投票應用中,我們創建兩個模型:Question和Choice。Question模型有一個問題內容和一個發布時間。Choice有兩個字段:選擇文本和投票數。Choice和Question是多對一的關系。
這些概念我們用Python類來代表,編輯 polls/models.py 文件:
from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
代碼很簡單,每一個模型是一個繼承django.db.models.Model的子類,每一個模型具有很多類變量,每一個變量代表一個數據庫字段。每一個字段都是有一個Field類的實例來表示,例如,CharField代表字符字段和DateTimeField代表日期字段。這就告訴Django每一個字段是什么數據類型。Field類的實例的名稱(如,choice_text),就是數據庫表的字段名。
有些Field類是需要必須參數的,比如CharField,必須要提供max_length的參數。它不僅僅會在數據庫架構中用,在驗證中也會用到。一個字段可以有多個可選參數,在本例中,我們設置votes的默認值為0;
最后,注意在本例中使用ForeignKey定義了一個關系,它告訴Django每個Choice對應一個Question。Django支持所有的數據庫關系:多對一,多對多,一對一。
激活模型
簡單的模型定義告訴Django很多信息,有了他,Django可以:
- 創建一個針對這個應用的數據庫架構。
- 創建一個Python數據庫訪問API來訪問Question和Choice對象。
但是首先需要告訴我們的Django項目polls應用已經被安裝了。再次編輯mysite/settings.py文件,修改INSTALLED_APPS,把'polls.apps.PollsConfig'加入列表,如下所示:
INSTALLED_APPS = [ 'polls.apps.PollsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] |
注意:INTALLED_APPS列表直接寫應用的名稱也是可以的(如,'polls'),官方建議是寫AppConfig的子類,'polls.apps.PollsConfig'中PollsConfig,這個類在創建應用時已經自動創建好了,在polls/apps.py文件里面定義,這個類里面可以定義關於應用的一些元數據如應用名稱,描述等信息,Django提供了一些公用API可以讀取里面的配置信息,暫時沒有發現其他什么特別的用處。
現在Django已經知道包含了polls應用了,運行另外一個命令:
$ python manage.py makemigrations polls
你可以看到如下的內容:
Migrations for 'polls':
polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice |
通過運行makemigrations,就是告訴Django項目模型已經有了那些修改,並且存儲這些修改信息在polls/migrations/0001_initial.py文件中。
如果你想查看遷移將在數據庫中執行哪些操作,可以運行命令:
$ python manage.py sqlmigrate polls 0001
你將可以看到遷移所用到的Sql語句。
注意以下幾點:
- 輸出的內容會根據你使用的數據庫的不同而不同。
- 表明是通過合並應用名稱和模型名字的小寫自動生成的(如,polls_question)(可以重寫)。
- 主鍵(id)是自動添加的(可以重寫)
- 通常情況下,Django會在模型名字基礎上追加“_id”作為外鍵字段的名字。(可以重寫)
- sqlmigrate命令不在數據庫上更改,僅僅是打印遷移的sql語句。
如果你感興趣的話可以運行python manage.py check來檢查你項目中的任何問題。
現在運行migrate命令在數據庫里創建這些表:
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK
遷移的命令是非常強大的,讓你可以隨時修改你的模型,而不需要刪除你的數據庫或表,可以很方便升級你的數據庫,不會丟失數據,后面會詳細介紹他們,現在你只要記住需要三步來應用模型的變化:
- 修改模型(在models.py)。
- 運行python manage.py makemigrations創建這些修改遷移。
- 運行python manage.py migrate應用這些修改到數據庫。
使用API
現在,讓我們進入Python shell的交互式環境並且使用Django提供的免費API。使用如下命令進入python shell:
$ python manage.py shell
這個命令是進入我們項目的shell交互環境,現在我們可以使用API來操作表:
# 創建一個問題,Django默認有日期模塊,所以這兒使用timezone >>> from django.utils import timezone >>> q = Question(question_text=”What’s New?”,pub_date=timezone.now()) # 保存對象到數據庫,你必須明確調用save()方法 >>> q.save() # 現在你可以訪問model字段的值了 >>> q.id 1 >>> q.question_text What’s new?” # 修改你要修改的屬性,然后調用save()方法 >>> q.question_text=”What’s up?” >>> q.save() # 查詢所有問題信息 >>> Question.objects.all() <QuerySet [<Question: Question object>]> # 查詢投票選擇 >>> q.choice_set.all()
上面的查詢信息返回<QuerySet [<Question: Question object>]>,我們不知道這個對象都有什么東西,那么怎么解決這個問題呢,接下來分別在Question和Choice增加__str__方法,編輯文件polls/models.py:
from django.db import models from django.utils.encoding import python_2_unicode_compatible @python_2_unicode_compatible # 如果需要支持python 2.x的話,加上這個修飾符 class Question(models.Model): # ... def __str__(self): # 在python 2.x中,函數名為__unicode__ return self.question_text @python_2_unicode_compatible # 如果需要支持python 2.x的話,加上這個修飾符 class Choice(models.Model): # ... def __str__(self): # 在python 2.x中,函數名為__unicode__ return self.choice_text
再次進入python shell環境,查看所有信息:
>>> Question.objects.all()
<Question: What’s up>
介紹Django管理后台
這個后台主要是方便客戶或員工來管理網站內容的
創建管理員
首先我們需要創建一個可以登錄到管理站點的用戶,運行下面的命令:
$ python manage.py createsuperuser
按照提示輸入用戶名、郵箱地址、密碼;現在管理員用戶已經創建好了,輸入命令python manage.py runserver啟動開發服務器,然后在瀏覽器輸入地址 http://127.0.0.1:8000/amdin,就可以用我們剛剛創建的用戶登錄系統。
將應用注冊到管理系統
登錄后系統我們發現,在管理界面首頁並沒有我創建的投票應用,那么現在我們來看一下我們的應用如何注冊到管理系統,編輯文件polls/admin.py:
from django.contrib import admin from .models import Question admin.site.register(Question)
現在Question已經注冊了,打開后台管理的首頁就可以看到我們的應用:
現在你可以對Question進行管理了。
注意一下幾點:
- 表單是根據Question模型,自動生成的。
- 不同的模型字段類型由相應的HTML輸入組件表示。
注意:在后台管理系統設置好后,如果系統的圖片都顯示不出來,需要在mysite/settings.py 加入如下設置:
import mimetypes mimetypes.add_type("image/svg+xml", ".svg", True) mimetypes.add_type("image/svg+xml", ".svgz", True)
可能是因為系統中沒有SVG媒體類型的設置。