Django學習筆記(二)App建立之Model

來源:互聯網
上載者:User

標籤:

通過執行個體學習, 構建一個投票(Polls)Application, 目標結果包含兩個site, 一個site用來顯示投票問題以及投票結果(即將展示出來的網站), 另一個site用來管理Poll執行個體的增刪改查(即後台內容管理CMS).

1.   建立工程

django-admin.py startproject mysite

在目前的目錄下, 會建立一個mysite的工程目錄. 那麼我們的代碼放在哪裡比較好呢? 可能會放到OS內建的server根目錄(document root)下, 比如/var/www, 這樣我們可以直接通過瀏覽器訪問到代碼. 不過這樣代碼的安全性不是很好,所以建議放到server根目錄以外的目錄下.

工程結構:

 1   mysite/ 2     manage.py 3     mysite/ 4       __init__.py 5       settings.py 6       urls.py 7       wsgi.py 8  9   外層的mysite目錄, 是工程的整個容器, 對django是沒什麼意義的, 所以隨便改什麼名字都可以.10   manage.py是一個命令列工具, 來管理整個工程, --help來查看相應的命令.11   內層的mysite目錄, 是工程的一個包, 同時也是工程的入口, 我們需要通過這個包名來引用我們需要的各種配置和變數.12   mysite/__init__.py: 說明當前這個目錄mysite/是一個python包.13   mysite/settings.py: 工程的設定檔14   mysite/urls.py:工程的路由調度15   mysite/wsgi.py:wsgi伺服器的進入點(How to deploy with WSGI)

2.   內部程式開發伺服器

python manage.py runserver

進入工程目錄下,執行以上命令,django內部內建程式開發伺服器(一個純粹由python寫的輕量級伺服器)將會啟動. 瀏覽器中訪問localhost:8000, 

我們會看到一個“Welcome to Django”, it worked.

註:改變監聽連接埠命令:python manage.py runserver 8080      改變監聽所有公用IPs: python manage.py runserver 0.0.0.0:8000

3.   資料庫設定

更改DATABASES ’default’選項

Engine - django.db.backends.*, oracle、mysql或者sqlite3等, 其他的後端比如(south.db.) sql_server.pyodbcNAME – 資料庫名稱,如果使用sqlite3,此處應該是檔案的絕對路徑(e.g.C:/homes/user/mysite/sqlite3.db).請注意此處用斜杠,而不是反斜線.USER – 資料庫使用者名稱(sqlite不需要)PASSWORD – 資料庫密碼(sqlite不需要)HOST – 資料庫主機地址 “127.0.0.1” or "**.**.com"
PORT - 主機開放連接埠 一般為3306 如果使用mysql或者PostgreSQL,首先必須在資料庫伺服器連接埠,執行建立資料庫命令,確保設定中的資料庫是存在的,而sqlite不需要,同步資料時會預設建立.

python manage.py syncdb

django會自動同步 INSTALLED_APPS 下的所有Apps到資料庫中,表現形式為各個App建立相應的資料表,與此同時,第一次執行會建立一個用於管理資料表的超級管理員 super administrator.

4.   Model建立

項目中所有用到的Apps其實都是由python的包組成的.

  Project和 App的區別:

  App是一個旨在專門完成某項工作的Web應用, 比如Blog、Session記錄等, 而Project是設定檔和一系列Apps集合所組成的. 一個工程中可以有多個App, 一個App可以存在多個Project中(即可複用性). 一個App可以放在任意地方, 只需要添加到Python path中, 讓工程可以找到.

python manage.py startapp polls

執行後會在工程根目錄下建立一個polls目錄, 包含__init__.py view.py models.py etc. 如果想把某個App包含在單獨的目錄下, 比如/mysite/apps, 進入到apps目錄後, python ../manage.py startapp polls, 不過以後引用要從apps開始匯入, from apps.polls.models import Poll, Choice.

下面在polls\models.py中輸入如下代碼:

from django.db import modelsclass 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)

代碼清晰明了, 兩個類均繼承於django.db.models.Model, 變數都是Filed執行個體, 兩個類的關係由models.ForeignKey(多對一)確定, Poll是Choice的外鍵, 即一個Poll對應多個Choice.

將Polls配置到setting.py檔案的 INSTALLED_APPS 中(不要忘記每個App配置後用逗號分隔), 然後執行python manage.py syncdb, 在資料庫中建立好Polls App的資料表. python manage.py sql polls, manage.py validate等命令可以用來進一步研究django在後台運作的原理.

5.   DB API互動

python manage.py shell

運行此命令後, manage.py命令會設定 DJANGO_SETTINGS_MODUL 環境變數, 這提供了django引用python全域路徑., 我們需要的資源都有了出處.

 1 >>> from polls.models import Poll, Choice   # Import the model classes we just wrote. 2 # No polls are in the system yet. 3  4 >>> Poll.objects.all() 5 [] 6  7 >>> from django.utils import timezone 8 >>> p = Poll(question="What‘s new?", pub_date=timezone.now()) 9 # Save the object into the database. You have to call save() explicitly.10 >>> p.save()11 12 >>> p.id13 114 15 >>> Poll.objects.all()16 [<Poll: Poll object>]

稍等一下, [<Poll: Poll object>]顯示不清晰, 對直觀的感受沒什麼協助, 解決辦法是: 在models.py中為不同的類添加一個__unicode__方法, 在python3中, 因為規範了字串的統一處理, 需要用 __str__ 進行替換.

1 class Poll(models.Model):2     # ...3     def __unicode__(self):  # Python 3: def __str__(self):4         return self.question5 6 class Choice(models.Model):7     # ...8     def __unicode__(self):  # Python 3: def __str__(self):9         return self.choice_text

python2.*版本沒有統一unicode和Ascii編碼的處理, 所以針對字串會經常出現錯誤, 比如在__unicode__中return self.id, CMD中遍曆輸出unicode資料, 都是編解碼錯誤的原因.

重新載入python manage.py shell,

>>> from polls.models import Poll, Choice
# 確保 __unicode__() 已工作.>>> Poll.objects.all()[<Poll: What‘s up?>]# 以下語句相當於 Poll.objects.get(id=1).>>> Poll.objects.get(pk=1)<Poll: What‘s up?>>>> p = Poll.objects.get(pk=1)# 顯示所有與p相關的choice集合 -- 目前為止為none.>>> p.choice_set.all()[] # 建立三個choice執行個體.>>> p.choice_set.create(choice_text=‘Not much‘, votes=0)<Choice: Not much>>>> p.choice_set.create(choice_text=‘The sky‘, votes=0)<Choice: The sky>>>> c = p.choice_set.create(choice_text=‘Just hacking again‘, votes=0) # 可通過choice執行個體訪問外鍵, 由於__unicode__, 只返回“What‘s up”.>>> c.poll<Poll: What‘s up?># 取得所有P下的choice集合.>>> p.choice_set.all()[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>>> p.choice_set.count()3

That‘s it.

 

Django學習筆記(二)App建立之Model

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.