django實例:建立你的第一個應用投票系統(2)數據庫的安裝

在上一篇中 django實例:建立你的第一個應用投票系統(一) 已經介紹基本的功能,並已經啓動服務了。這一節介紹數據庫相關的東東。 html

首頁打開mysite/settings.py配置文件, java

設置數據庫
打到DATABASES python

ENGINE:這個是所要使用的數據庫類型,如 postgresql、sqlite、mysql等。以下設置: mysql

django.db.backends.mysql

NAME:數據庫的名稱或者若是你使用的是sqlite的話就是sqlite的路徑。 

USER :數據庫的用戶名

PASSWORD :數據庫密碼

HOST:數據庫地址

設置應用APP
找到INSTALLED_APPS
在這裏你看到的這些是django默認的應用 sql

django.contrib.auth – 用戶認證應用 django.contrib.contenttypes – 內容類型應用 django.contrib.sessions – session管理應用 django.contrib.sites – 管理多個站點的應用 django.contrib.messages – 消息處理 django.contrib.staticfiles – 靜態文件應用

下面再介紹一個命令:syncdb

這個命令會根據安裝的app應用生成相應的數據庫表結構、索引等信息。執行方式以下: shell

python manage.py syncdb

執行完後 會看到在你設置的數據庫中多了幾張表,這些表就是django默認安裝的應用所生成的表。

建立投票系統模型
下面先建立投票模型 數據庫

python manage.py startapp polls

生成的目錄結構以下: django

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

打開polls/models.py 文件,在裏面寫數據表信息。 c#

複製代碼
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)
複製代碼

裏面包括兩個class,每一個class 都是從django的models.Model繼承的。class裏面的CharField、DateTimeField等用來建立相應的字段類型。
如question = models.CharField(max_length=200) 這個就代碼建立字符類型的字段,最大長度爲200

固然CharField、DateTimeField等都是從models.Field繼承而來的。若是你想實現本身的數據類型列,也能夠從models.Field繼承,實現你特定的功能。

第一個爲投票項,設置了兩個字段
question:輸入問題的字段,
pub_date:發佈時間字段。

第二個爲選項,包括三個字段
poll:設置選項所對應的投票項
choice_text:選項文本
votes:投票數

如今把咱們添加的這個應用添加到 setting.py配置文件中 session

複製代碼
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'polls', )
複製代碼

接着執行以下命令:

python manage.py sql polls

你會看到在cmd命令窗口中會出現建立表的sql語句。執行這個命令僅僅是顯示下 django內部根據模型會怎樣一步步的來自動建立相應的表的。

複製代碼
BEGIN; CREATE TABLE "polls_poll" ( "id" serial NOT NULL PRIMARY KEY, "question" varchar(200) NOT NULL, "pub_date" timestamp with time zone NOT NULL ); CREATE TABLE "polls_choice" ( "id" serial NOT NULL PRIMARY KEY, "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id") DEFERRABLE INITIALLY DEFERRED, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL ); COMMIT;
複製代碼

固然還有幾個有關模型的sql命令

python manage.py validate – Checks for any errors in the construction of your models.
python manage.py sqlcustom polls – Outputs any custom SQL statements (such as table modifications or constraints) that are defined for the application.
python manage.py sqlclear polls – Outputs the necessary DROP TABLE statements for this app, according to which tables already exist in your database (if any).
python manage.py sqlindexes polls – Outputs the CREATE INDEX statements for this app.
python manage.py sqlall polls – A combination of all the SQL from the sql, sqlcustom, and sqlindexes commands.

如今咱們再執行syncdb,這個時候就會在數據庫中看到poll表和choice表了。

python manage.py syncdb

如今打開shell,在裏面進行一些簡單的經常使用的增、刪、改、查。

python manage.py shell
複製代碼
>>> from polls.models import Poll, Choice # Import the model classes we just wrote. # 獲取Poll裏面的數據,固然如今是沒有的,因此爲空 >>> Poll.objects.all() [] # 添加一個投票,在這個引入了django裏面的關於時間的一個模塊。 >>> from django.utils import timezone >>> p = Poll(question="What's new?", pub_date=timezone.now()) # 保存 >>> p.save() # 看看保存以後生成的id及question和pub_date >>> p.id 1
>>> p.question "What's new?" >>> p.pub_date datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>) # 修改question,記得要保存 >>> p.question = "What's up?" >>> p.save() # 再查看一個 >>> Poll.objects.all() [<Poll: Poll object>]
複製代碼

在這個咱們看到,輸出的是<oll: Poll object>這個對象,咱們相要的是直接的數據,因此在每一個class裏面給加上__unicode__() ,來輸出相應的內容,其實就至關於c#、java裏面的ToString()給重載下。

複製代碼
class Poll(models.Model): # ... def __unicode__(self): return self.question class Choice(models.Model): # ... def __unicode__(self): return self.choice_text
複製代碼

你能夠看看__unicode__() 和  __str__()的區別

咱們給Poll class增長一個新的方法

複製代碼
import datetime from django.utils import timezone # ... class Poll(models.Model): # ... def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
複製代碼

下面咱們再操做一下。

複製代碼
>>> from polls.models import Poll, Choice # Make sure our __unicode__() addition worked. >>> Poll.objects.all() [<Poll: What's up?>] # >>> Poll.objects.filter(id=1) [<Poll: What's up?>] >>> Poll.objects.filter(question__startswith='What') [<Poll: What's up?>] # 根據發佈時間來查找數據 >>> from django.utils import timezone >>> current_year = timezone.now().year >>> Poll.objects.get(pub_date__year=current_year) <Poll: What's up?> # Request an ID that doesn't exist, this will raise an exception. >>> Poll.objects.get(id=2) Traceback (most recent call last): ... DoesNotExist: Poll matching query does not exist. Lookup parameters were {'id': 2} >>> Poll.objects.get(pk=1) <Poll: What's up?> # 調用咱們剛纔添加的方法 >>> p = Poll.objects.get(pk=1) >>> p.was_published_recently() True # 根據主鍵來查找數據 >>> p = Poll.objects.get(pk=1) >>> p.choice_set.all() [] # 建立三個選項 >>> 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) # 訪問投票項 >>> c.poll <Poll: What's up?> # 由poll對象來訪問 它關聯的選項的因此的集合 >>> p.choice_set.all() [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>] >>> p.choice_set.count() 3 # 查詢投票項發佈時間是今年的選項 >>> Choice.objects.filter(poll__pub_date__year=current_year) [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>] # 查找當前投票中以Just hacking爲開頭的選項,並刪除 >>> c = p.choice_set.filter(choice_text__startswith='Just hacking') >>> c.delete()
複製代碼

對數據庫的訪問基本就這些了

相關文章
相關標籤/搜索