Django初級手冊1-專案和應用的建立與簡單的資料庫操作

Solon Tan發表於2014-02-27

建立專案

 django-admin.py startproject mysite

1. 目錄結構

mysite/ #專案的名稱
  manage.py #可通過命令和專案進行互動的檔案
  mysite/ #專案的實際資料夾
    __init__.py #空檔案,告訴python這個目錄是個python包
    settings.py #該專案的配置檔案
    urls.py #專案的URL宣告,dispatch檔案
    wsgi.py #專案wscgi的一個入口

2. 啟動開發機

只用於開發環境,不能用於生產環境!
開發環境支援熱啟動

python manage.py runserver #default 8000
#如果主機想訪問虛擬機器需要指定IP和埠
python manage.py runserver 0.0.0.0:8000

3. 資料庫

需求MySQLdb

pip2.7 install mysql-python -i http://pypi.douban.com/simple

settings.py檔案中進行設定

#mysql的資料庫必須提前建好
DATABASES = {
    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
#修改時區
#TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
#預設apps
INSTALLED_APPS = (
    'django.contrib.admin', #管理頁面
    'django.contrib.auth', #許可權系統
    'django.contrib.contenttypes', #內容框架
    'django.contrib.sessions', #回話框架
    'django.contrib.messages', #訊息框架
    'django.contrib.staticfiles', #管理靜態內容框架
)
#此命令會安裝上述的app,並生成對應的表,在此建立系統管理員帳號和密碼
python manage.py syncdb

建立模型

app完成某個特定的功能,諸如微博系統,公共記錄資料庫亦或是一個簡單的投票程式。
project是若干配置檔案與許多app組成的特殊網站。
project可以包含很多app,app也可用於多個project。

python manage.py startapp polls

這會生成

polls/
    __init__.py
    admin.py
    models.py
    tests.py
    views.py

首先應該定義模型。
模型是關於資料的獨立、限定的資源。它包括要儲存的資料的必要的欄位和行為。
Django遵循DRY原則,即Don't repeat youself——每一個獨立的概念或資料都儲存在一個地方,並且儲存一份。
定義所有的模型,關於投票,建立投票和選擇兩個模型,投票包括一個問題和一個發起日期,選擇包括選擇的內容和投票計數。每一個選擇應該關聯一個投票。

    from django.db import models

    class Poll(models.Model):
        question = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')

    class Choice(models.Model):
        poll = models.ForeignKey(Poll)
        choice_text = models.CharField(max_length=200)
        votes = models.IntegerField(default=0)

每個模型對應一個類,每個類繼承自models.Model,每個類對應一張表。
每個類成員對應該表的列,並且有自己的型別。有些引數是必須的例如max_length,它不只是資料庫的模式,還包括頁面的驗證。而整數型別的預設值是可選的。
最後類之間的關係用外來鍵來描述。該處需要注意的是,poll會自動處理為poll_id加到

啟用模型

首先應該在settings.py中新增該應用。

INSTALL_APPS = (
    ...
    ...
    'polls',
)

然後鍵入命令,觀察models生成的SQL語句。

python manage.py sql polls

這裡有一些額外的命令可以觀察實際的構成。

python manage.py validate #檢查錯誤,尤其是構建apps的model後檢查,再執行syncdb之前
python manage.py sqlcustom polls #輸出應用定義的custom sql statement
python manage.py sqlclear polls #輸出應用中有必要DROP TABLE的語句
python manage.py sqlindexes polls
python manage.py sqlall polls #輸出sql sqlcustom sqlindexes的集合

然後要實際執行這些語句,在資料庫中實際建立他們。該語句只用於初次建立時

python manage.py syncdb

呼叫API來工作

#進入互動介面
python manage.py shell
>>> from polls.models import Poll, Choice
#顯示所有例項
>>> Poll.objects.all()
[]
>>> from django.utils import timezone
#建立一個物件
>>> p = Poll(question="What's new?", pub_date=timezone.now())
#存入資料庫
>>> p.save()
#可使用p.question等修改,檢視類成員函式,修改後再次save即可
>>> Poll.objects.all()
[<Poll: Poll object>] #這是由於__unicode__沒有設定的結果,
class Poll(models.Model):
    # ...
    def __unicode__(self):  # Python 3: def __str__(self):
        return self.question
#這樣即可輸出
>>> Poll.objects.all()
[<Poll: What's new?>]
#查詢資料庫,filter(類成員名稱後雙下劃線,可以加入各種比較)
#get可直接用來查詢,其中pk可用來查詢主鍵,PrivateKey
>>> Poll.objects.filter(question__startswith='What')
[<Poll: What's up?>]
>>> current_year = timezone.now().year
>>> Poll.objects.get(pub_date__year=current_year)
<Poll: What's up?>

因為Poll是Choice的外來鍵,所以Poll有如下的成員函式

>>> p.choice_set.all()
[]
>>> c = p.choice_set.create(choice_text='Just hacking again', votes=0)
>>> p.choice_set.all()
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
>>> p.choice_set.count()
3
# Choice也有如下的成員變數
>>> c.poll
<Poll: What's up?>
#刪除某個記錄
>>> c = p.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()

相關文章