標籤:
經過上一章,我們已經建立好一個django app了,接下來,我們開始完善它。
首先,我們先瞭解些基本概念。
Django中建立的每個應用程式都是由Python的包組成,遵循某些約定。Django配有一個公用程式,自動產生一個應用程式的基本目錄結構,所以您可以專註於編寫代碼,而不是建立目錄。
那麼項目和應用程式到底有什麼區別呢?
一個app是一個web應用:比如一個部落格系統,一個簡單的投票系統。而一個項目是一個集合的配置和應用程式特定的Web網站。一個項目可以包含多個應用程式。應用程式可以存在於在多重專案。
應用程式可以放置在任何Python路徑下。在本文中,我們將應用與manage.py檔案放在同一個目錄下,以便它可以作為一個頂級模組,而不是為mysite的子模組。
所以首先,我們進入到manage.py的同級目錄下,也就是C:\mysite,輸入下面的命令:
manage.py startapp polls
polls的目錄結構如下:
polls/ __init__.py models.py tests.py views.py
寫資料庫Web應用程式的第一步就是定義模型,從本質上講就是用一些額外的中繼資料,定義資料庫布局。模型需要對必要欄位和資料行為進行定義。
在我們的程式中,我們需要建立兩個模型:Poll 和 Choice,Poll包含提問和提問的日期,Choice包含投票的選項和票數的統計,每一個Choice都與一個Poll相關聯。
下面修改polls/models.py:
# -*- coding: utf-8 -*-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)
這裡的代碼很直觀,每一個model都代表了django.db.models.Model的子類,每一個model都有一些變數,用來定義資料的類型與範圍。
每一個變數都是一個欄位的執行個體,CharField表示字串欄位,DateTimeField表示日期欄位,每個欄位執行個體(如question或pub_date)在資料庫中代表一列。你可以在第一個參數位置欄位輸入一個字串,告訴人們這個變數的含義,比如‘date published‘。有些變數你需要給他設定一些初始參數。比如IntegerField。表與表之間會有一些外鍵,可以用ForeignKey去設定。Django裡的外鍵有many-to-ones, many-to-manys and one-to-ones.
這些代碼將告訴Django做以下事情:
- 為這個應用建立資料結構(為這些表建立聲明) .
- 為Poll和Choice等對象建立資料介面。
做這些之前,我們首先得告訴程式,Poll應用已經建好了。修改setting.py裡的INSTALLED_APPS,向裡面添加polls如下:
INSTALLED_APPS = ( ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.sites‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘polls‘ # Uncomment the next line to enable the admin: # ‘django.contrib.admin‘, # Uncomment the next line to enable admin documentation: # ‘django.contrib.admindocs‘,)
現在,程式知道polls應用已經安好,下面來執行另外一個命令:
manage.py sql polls
出現如下內容:
BEGIN;CREATE TABLE "polls_poll" ( "id" integer NOT NULL PRIMARY KEY, "question" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);CREATE TABLE "polls_choice" ( "id" integer NOT NULL PRIMARY KEY, "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"), "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);COMMIT;
讓我們來解釋一下它:
這裡的polls_poll 和 polls_choice都是系統根據model裡的變數自動產生的,由於我們沒有設定主鍵,所以系統將主鍵設定為id.
sql命令並沒有真的去資料庫中執行SQL語句——它只是列印到螢幕上,這樣你可以看到SQL Django認為是必需的。
下面介紹幾個命令:
manage.py validate
用來檢查模型是否正確。
manage.py sqlcustom polls
輸出任何自訂SQL語句(如表的修改或為應用程式定義的約束)。
manage.py sqlclear polls
為這個應用程式輸出必要的DROP TABLE語句,根據哪些表已經存在於您的資料庫(如果有的話)。
manage.py sqlindexes polls
為這個應用程式輸出CREATE INDEX語句。
manage.py sqlall polls
上述所有命令的集合。
現在,可以為這些模型建立表了,執行:
manage.py syncdb
注意,這個命令只會為沒有建立過表app去建立新表。
django (三) 第一個django app 建立model