Django 學習筆記 part 1

/** 本篇是我看 http://djangogirlstaipei.herokuapp.com/tutorials/ 的邊做邊紀錄筆記 **/
Django學習資源
建立一個虛擬環境 ( virtualenv ) python 3.3 
有許多優點:
  • 你的專案會擁有一個專屬的獨立 Python 環境
  • 不需要 root 權限,就可以安裝新套件。
  • 方便控管不同版本的套件,不用擔心
  • 升級套件會影響到其他專案。
  • 如果需要多人協作或在不同機器上跑同一個專案時,使用虛擬環境也可以確保環境一致性。
VENV
python3 -m venv VENV
source VENV/bin/activate
接著就來安裝 django 1.7 版本中最新的那個!
  • pip install "django<1.8"

天外飛來一筆:
在實驗室的sever上面run的方法:
使用指令 python manage.py runserver 0.0.0.0:8000
把本機端的VENV傳到server上
scp -r VENV 我的帳號@實驗室的ip:~/ 
:~/  這是放到我的根目錄,後面其實可以再加東西
 scp 是 secure copy的簡寫
更新code到server上
rsync -a VENV 我的帳號@實驗室的ip:~/
rsync 用法

做完剛剛的pip install "django<1.8"以後

使用VENV
source VENV/bin/activate

建立 Django project建立專案資料夾 -- startproject
首先,使用 django-admin.py 來建立第一個 Django project mysite:
  • django-admin.py startproject mysite
此時會多了一個 mysite 資料夾,我們切換進去
  • cd mysite
  • startproject 這個 Django 指令除了建立專案資料夾,也預設會建立一些常用檔案,你可以使用 ls 或 dir /w (Windows) 檢視檔案結構。
目前 project 的檔案結構如下:
  • mysite/
  • ├── mysite
  • │   ├── __init__.py
  • │   ├── settings.py
  • │   ├── urls.py
  • │   └── wsgi.py
  • └── manage.py

要跑server的話使用指令
python manage.py runserver

建立 Django application (app)
現在,讓我們利用 startapp 建立第一個 Django app -- trips:
  • python manage.py startapp trips
  • startapp會按照你的命名建立一個同名資料夾和 app 預設的檔案結構如下:
  • trips
  • ├── __init__.py
  • ├── admin.py
  • ├── migrations
  • ├── models.py
  • ├── tests.py
  • └── views.py


Django Views
Django view 其實是一個 function,處理 HttpRequest 物件,並回傳 HttpResponse 物件,大致說明如下:
  • 會收到HttpRequest 物件參數: Django 從網頁接收到 request 後,會將 request 中的資訊封裝產生一個 HttpRequest 物件,並當成第一個參數,傳入對應的 view function。
  • 需要回傳HttpResponse物件: HttpResponse 物件裡面包含:
  • HttpResponse.content
  • HttpResponse.status_code ...等


Django Urls
最後,Django 需要知道 URL 與 View 的對應關係
例如:
有人瀏覽 http://127.0.0.1:8000/hello/ ,hello_world() 這個 view function 需要被執行。
而這個對應關係就是 URL conf (URL configuration)。
URL Conf
  • 通常定義在urls.py
  • 是一連串的規則 (url pattern)
  • Django 收到 request 時,會一一比對 URL Conf 中的規則,決定要執行哪個 view function

安裝套件
  • pip install python-dateutil

HTML動態內容

第一個 Template
在前一個例子,我們把 HTML/CSS 放在 View function 裡。但在實務上,我們會將前端的程式碼獨立出來,放在 templates 資料夾裡。不僅增加可讀性,也方便與設計師或前端工程師分工。
Template 資料夾
首先建立 Template 資料夾。開啟終端機 (如果不想關閉 web server,可以再開新一個新的終端機視窗),並確認目前所在位置為 djangogirls/mysite/。
新增一個名為 templates 的資料夾`:
  • mkdir templates
設定 Templates 資料夾的位置
建立好資料夾以後,我們需要修改mysite/settings.py,加上TEMPLATE_DIRS:
  • # mysite/settings.py

  • TEMPLATE_DIRS = (
  •     os.path.join(BASE_DIR, 'templates').replace('\\', '/'),
  • )

Models
現今的網站,都不再只是僅單純展示網頁內容的靜態網頁。大多數網站,都會加上一些與使用者互動的功能,如留言版、討論區、投票...等。而這些使用者產出的資料,往往會儲存於資料庫中。
這一章,你會學到如何利用 Django Model 定義資料庫的結構 ( Schema ),並透過 Django 指令創建資料庫、資料表及欄位。
使用 Django Model 的好處
雖然資料庫的語法有其標準,但是各家資料庫還是或多或少有差異。使用 Django Model 的來操作資料庫的優點之一,就是資料庫轉換相當方便
在大部份情況下,不再需要為不同的資料庫,使用不同語法來撰寫程式。只要修改設定,就可以輕易地從 SQLite 轉換到 MySQL、PostgreSQL、或是 Oracle...等等。

建好model的話跟RoR一樣要做 migration 
恩失敗了
根據他說的要先
python manage.py makemigrations
再 python manage.py migrate

使用 Django ORM 操作資料庫
在上一章,我們學到如何使用 Django Model 抽象地表達資料庫結構。 在完成 Model 的定義後,我們即可使用 Django 提供的豐富 API ,來與資料庫互動。
本章你會學到:如何使用 Django API 來與資料庫互動 (CRUD)。
CRUD 指的是,Create (新增)、Read (讀取)、Update (修改)、Delete (刪除) 等常見的資料庫操作。
使用 Django Shell
與先前不同的是,在這裡我們不使用 Python Shell。 若要在 Python Shell 使用 Django 的功能或模組,還需另外載入設定。
所以我們這裡使用的是 Django Shell
Django Shell
與 Python Shell 類似的互動式命令列。會預先載入 Django 的相關設定,所以可以在此執行 Django 的 API。
使用 shell 指令,進入 Django Shell:
  • python manage.py shell
這個 shell 和我們之前輸入 python 執行的 shell 長得一樣,只是它會預先為我們設定 Django 需要的環境,方便我們執行 Django 相關的程式。

Create
首先,讓我們來試著新增幾筆資料:
  • >>> from trips.models import Post
  • >>> Post.objects.create(title='My First Trip', content='肚子好餓,吃什麼好呢?'location='台北火車站')
  • <Post: Post object>
  • >>> Post.objects.create(title='My Second Trip', content='去散散步吧'location='台北火車站')
  • <Post: Post object>
  • >>> Post.objects.create(title='Django 大冒險', content='從靜態到動態'location='台北市大安區復興南路一段293號')
  • <Post: Post object>

Read
若想顯示所有的 Post ,可以使用 all()
  • >>> Post.objects.all()
  • [<Post: Post object>, <Post: Post object>, <Post: Post object>]
Django 通常以 <Post: Post object> 來表示 Post 物件,但此種顯示不易辨別。我們可以透過def __str__ 更改 Post 的表示方式,修改 trips/models.py:
  • # trips/models.py
  • from django.db import models

  • class Post(models.Model):
  •     ...
  •     created_at = models.DateTimeField(auto_now_add=True)

  •     def __str__(self):
  •         return self.title
退出 Django Shell 後再重新進入,Post 已經被重新定義成顯示標題,如 <Post: Your_Post_Title>。
  • >>> Post.objects.all()
  • [<Post: My First Trip>, <Post: My Second Trip>, <Post: Django 大冒險>]
而只想顯示部分資料時,則可以使用 get 或 filter:
  • >>> Post.objects.get(id=1)
  • <Post: My First Trip>

  • >>> Post.objects.filter(id__gt=1)
  • [<Post: My Second Trip>, <Post: Django 大冒險>]
  • get:返回符合條件的唯一一筆資料。 ( 注意:如果找不到符合條件的資料、或是有多筆資料符合條件,都會產生 exception )
  • filter:返回符合條件的陣列。如果找不到任何資料則會返回空陣列。

Update
當想修改資料時,可以使用 update 更新一筆或多筆資料:
首先,先取得欲更新的 Post。這裡使用 id < 3 的條件篩選
  • >>> posts = Post.objects.filter(id__lt=3)
共有 2個 Post 符合 id < 3 的條件
  • >>> posts
  • [<Post: My First Trip>, <Post: My Second Trip>]
我們將 location 的值印出
  • >>> posts[0].location
  • '台北火車站'

  • >>> posts[1].location
  • '台北火車站'
  • >>>
印出後發現, 兩個 Post 的 location 都是台北火車站。現在我們試試用 update 指令,把它改成'捷運大安站'
  • >>> posts.update(location='捷運大安站')
  • 2
回傳的數字 2 指的是已被更新的資料筆數。我們可以驗證一下,location 是否皆已被正確更新
  • >>> posts[0].location
  • '捷運大安站'

  • >>> posts[1].location
  • '捷運大安站'

Delete
當然,也可以使用 delete 刪除一筆或多筆資料:
我們試著使用 delete,將剛剛的那兩筆 Post 刪除。
  • >>> posts.delete()
確認一下,資料是否刪除
  • >>> Post.objects.all()
  • [<Post: Django 大冒險>]


留言

這個網誌中的熱門文章

[筆記] CRLF跟LF之區別 --- 隱形的 bug

[ML筆記] Batch Normalization

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)

[ML筆記] Ensemble - Bagging, Boosting & Stacking