第59天: Web 開發 Django 模型

by 極光python

今天來爲你們介紹 Django 框架的模型部分,模型是真實數據的簡單明確的描述,它包含了儲存的數據所必要的字段和行爲,Django 遵循 DRY Principle 。它的目標是你只須要定義數據模型,而後其它的雜七雜八代碼你都不用關心,它們會自動從模型生成。mysql

Django 模型

Django 中模型是真實數據的簡單明確的描述,它包含了儲存的數據所必要的字段和行爲,在建立模型前須要先配置好數據庫。 Django 對各類數據庫提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle等,Django 爲這些數據庫提供了統一的調用 API。 咱們能夠根據本身業務需求選擇不一樣的數據庫。git

數據庫配置

Python 內置 SQLite,因此你無需安裝額外東西來使用它,在 TestProject 項目目錄下,打開 TestProject/settings.py 配置文件, 已經配置了 SQLite 做爲默認數據庫。固然若是在真實項目中,咱們能夠換一個更具擴展性的數據庫,如Mysql等。具體配置操做以下:github

# TestProject/settings.py

# Database
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

配置說明:sql

  • ENGINE:數據庫驅動,可選('django.db.backends.sqlite3','django.db.backends.postgresql','django.db.backends.mysql',或 'django.db.backends.oracle')
  • NAME:數據庫的名稱(這裏使用的SQLite對應的是一個數據庫文件路徑)
  • USER:數據庫登錄用戶名
  • PASSWORD:數據庫登錄密碼
  • HOST:數據庫所在主機鏈接地址(能夠是域名或IP地址)
  • PORT:數據庫所在主機服務端口號

建立模型

仍是以咱們以前建立的投票應用爲基礎,在這個應用中建立兩個模型--Question和Choice。shell

  • Question(問題)中包含提問的內容和發佈的時間兩個字段。
  • Choice(選項)中包含針對問題的選項以及已投票數,每一個問題能夠有多個選項。

下面咱們將以上模型描述經過編輯 polls/models.py 文件定義出來。數據庫

# polls/models.py

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('發佈日期')


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

  1. 每一個模型被定義爲 django.db.models.Model 類的子類。
  2. 每一個模型有一些類變量,它們都表示模型裏的一個數據庫字段。
  3. 每一個字段都是 Field 類的實例,如 CharField 對應數據庫中的字符串字段。
  4. 每一個 Field 類實例變量的名字也是字段名,如 question_text,定義時須要遵循數據庫字段規則。
  5. 實例變量的名字能夠定義備註名,方便代碼理解,如 pub_date = models.DateTimeField('發佈日期')。
  6. 某些 Field 類實例定義時須要參數,還有一些可選參數,對應數據庫表結構,如 CharField 類須要定義長度max_length。
  7. 使用 ForeignKey 能夠定義表外鍵關聯,如本例中用 ForeignKey 定義了每一個 Choice 都要關聯到一個 Question 對象上。

激活模型

經過配置上面 models.py 類中建立模型的代碼,已經足夠 Django 爲咱們建立數據庫和相應表結構了,如今咱們將 polls 應用安裝到咱們 TestProject 項目中。
首先再次打開 TestProject/settings.py 配置文件,在配置類 INSTALLED_APPS 中添加 polls 應用的點式路徑 'polls.apps.PollsConfig',配置完成以下所示:瀏覽器

# TestProject/settings.py

INSTALLED_APPS = [
    'polls.apps.PollsConfig',   #新增polls路徑
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

由於 PollsConfig 類寫在文件 polls/apps.py 中,因此它的點式路徑是 'polls.apps.PollsConfig'服務器

保存配置並退出,而後運行 makemigrations 命令, Django 會檢測你對模型文件的修改,而且把修改的部分儲存爲一次遷移(遷移是 Django 對於模型定義即你的數據庫結構的變化的儲存形式)。

$ python manage.py makemigrations polls
Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice

執行成功後,就能夠再執行 migrate 命令,將你在模型中定義的數據庫修改同步到應用的數據庫表結構上,執行結果以下:

$ python manage.py migrate
Operations to perform:
  Apply all migrations: polls
Running migrations:
  Applying polls.0001_initial... OK

數據庫遷移操做被分解成生成和應用兩個命令是爲了讓你可以在代碼控制系統上提交遷移數據並使其能在多個應用裏使用;這不只僅會讓開發更加簡單,也給別的開發者和生產環境中的使用帶來方便。

模型操做

對模型對象的操做,本質上就是數據庫數據的操做。下面咱們就經過對模型對象操做實現對數據庫記錄基本的CURD操做。

新增數據

編輯 TestProject 項目下 polls/views.py 文件代碼,經過訪問 URLQuestion 模型對應表中添加數據。

# polls/views.py
from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse
from polls.models import Choice, Question
from django.utils import timezone

def index(request):
    return HttpResponse("你好,這是一個投票頁面。")

# 增長問題描述信息
def add(request):
    question = Question(question_text='雙十一你在哪一個平臺剁手?',pub_date=timezone.now())
    question.save();
    return HttpResponse("新增投票成功!")

再編輯 polls/urls.py 文件代碼,新增一條 add 的路由,代碼以下:

# polls/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('add', views.add, name='add'),    #新增add路由
]

保存後,經過 python manage.py runserver 127.0.0.1:8080 命令啓動本地開發服務器,啓動後在瀏覽器中輸入URL地址 http://127.0.0.1:8080/polls/add ,會返回以下頁面表示新增數據成功。

接下來咱們再刷新下頁面,這樣就會再增長一條數據,而後咱們把這兩條記錄查出來。

查詢數據

Django 提供了多種方式來查詢出數據庫記錄,如查詢上面 Question 模型對應所有數據,某個id的數據以及經過多條件過濾獲得所須要的數據。依然編輯 TestProject 項目下 polls/views.py 文件,增長查詢對應代碼:

# polls/views.py
# …… 省略部分代碼

def query(request):
    # 經過objects這個模型管理器的all()得到全部數據行,至關於SQL中的SELECT * FROM question
    questionList = Question.objects.all()
    # 獲取單個對象
    response2 = Question.objects.get(id=1)
    # 至關於SQL中的WHERE id=1,可設置條件過濾
    response3 = Question.objects.filter(id=1)
    #根據id字段排序
    response5 = Question.objects.order_by("id")

    res = ""
    # 遍歷全部對象
    for q in questionList:
        res += str(q.id) + "." + q.question_text + " <br />"
    return HttpResponse("查詢全部問題:<br />" + res)

再編輯 polls/urls.py 文件代碼,新增一條 query 的路由,代碼以下:

# polls/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('add', views.add, name='add'),  
    path('query', views.query, name='query'),  #新增的query路由
]

而後再瀏覽器中輸入 URL http://127.0.0.1:8080/polls/query ,看到以下圖所求請求結果:

能夠看到出現兩條同樣的記錄,可是 id 不一樣,不過這正符合咱們的預期,下面咱們將對第一條數據進行修改和刪除。

修改數據和刪除

修改和刪除數據能夠操做一條或多條記錄,這取決於你的查詢條件,再次編輯 TestProject 項目下 polls/views.py 文件,增長修改和刪除對應代碼:

# polls/views.py
# …… 省略部分代碼

#修改數據
def update(request):
    question1 = Question.objects.get(id=1)
    question1.question_text = '天貓和京東你會選哪一個?'
    question1.save()

    # 經過條件過濾的方式也能夠更新一條或多條數據
    # Question.objects.filter(id=1).update(question_text='天貓和京東你會選哪一個?')

    return HttpResponse("更新id=1:" + question1.question_text)

#刪除數據
def delete(request):
    question2 = Question.objects.get(id=2)
    question2.delete()

    # 經過條件過濾的方式也能夠刪除一條或多條數據
    # Question.objects.filter(id=2).delete()

    # 刪除全部數據
    # Question.objects.all().delete()

    res3 = ''
    questionList = Question.objects.all()
    # 遍歷全部對象
    for q in questionList:
        res3 += str(q.id) + "." + q.question_text + " <br />"
    return HttpResponse("刪除後查詢:<br />" + res3)

再編輯 polls/urls.py 文件代碼,新增一條 query 的路由,代碼以下:

# polls/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('add', views.add, name='add'),  
    path('query', views.query, name='query'), 
    path('update', views.update, name='update'),  # 新增update路由
    path('del', views.delete, name='del'),  # 新增del路由
]

完成以上代碼配置,咱們就能夠經過訪問 URL http://127.0.0.1:8080/polls/update 實現第一條數據的更新操做,請求後返回頁面以下:

這樣咱們就把第一條數據的問題描述更新了,再次經過 URL http://127.0.0.1:8080/polls/query 查詢下全部數據,能夠看到返回頁面以下:

好,更新成功後,咱們再試下刪除數據了,經過查看刪除相關代碼是把 id 爲2的數據刪除了,此次咱們訪問的 URL http://127.0.0.1:8080/polls/del,而後返回刪除後再次查詢全部記錄的頁面,以下圖:

能夠看到只剩下一條數據,說明咱們已經刪除成功了。

總結

本文爲你們介紹了 Django 的模型,經過上面學習咱們瞭解到模型功能的強大,爲咱們基於數據庫的開發節省了大量工做量。Django還有模板,表單,路由,認證,基本的數據庫管理等等內建功能,接下來將進一步的介紹 Django 提供的其餘功能。

參考

示例代碼:https://github.com/JustDoPython/python-100-day

關注公衆號:python技術,回覆"python"一塊兒學習交流

相關文章
相關標籤/搜索