Django實戰(2):創建第一個模型類


從模型開始開發似乎是個好主意。一方面模型是整個應用的核心,實現了應用的業務數據和對業務數據進行操作的約束,而視圖和模板只是向用戶提供操作和展現這些數據的界面;另一方面模型相對於系統的其他部分更加穩定,將模型先確定下來有助於系統其他部分的實現。DDD(領域驅動設計)更進一步將模型中的核心對象抽取出來作為“領域模型”。

從Depot應用來看,產品(Product) 應該是模型中的核心對象之一。就讓我們先來實現Product模型。

創建app

我們可以從《Django第一步》中實現的工程開始。在繼續之前,還要進行一些准備工作。
Django約定必須要創建app才能使用模型。這也是Django的哲學之一:
Django認為一個project包含很多個Django appl;project提供配置文件,比如數據庫連接信息、 安裝的app清單、模板路徑等等;而一個app是一套Django功能的集合,通常包括模型和視圖,按Python的包結構的方式存在。
app可以在多個project之間很容易的復用。比如Django自帶的注釋系統和自動管理界面。

所以我們在原有工程的基礎上還需要創建一個app。現在假設我們只需要一個app,並將其命名為depotapp。創建應用的腳本也是使用project目錄下的managy.py:

$python manage.py startapp depotapp

就會在工程目錄下創建一個depotapp目錄:
depotapp/
     __init__.py
    models.py
    tests.py
    views.py

用python代碼定義數據庫

在《Django的第一印象》中介紹過,Django的設計是 以Python類的形式定義數據模型。之所以沒有采用rails的運行時自動獲取數據庫schema的”魔術方式“,是出於以下的考慮:
     1. 效率。運行時掃描數據庫可能會帶來性能問題。
     2. 明確性。只通過Model類就完全知道數據庫中有哪些字段,而不需要再切換到migration或schema文件中去查看,更不需要去查看數據庫結構。
     3. 一致性。你看到的只是Python代碼,完全不需要將大腦切換到”數據庫模式“,能極大提高開發效率。
     4. 版本控制。rails中的數據庫結構版本保存在一個個的migration文件中,這簡直就是版本管理的”反模式“。Django的方式是管理Model代碼文件的版本。
     5. 可擴展性。可以定義數據庫中不存在的”字段類型“。比如Email,URL,等等。
當然,Django也提供從現有數據庫表中自動掃描生成模型的工具。

so,《Agile Web Development with Rails》中的做法是先創建數據庫表:

drop table if exists products;
create table products (
id int not null auto_increment,
title varchar(100) not null,
description text not null,
image_url varchar(200) not null,
price decimal(10,2) not null,
primary key (id)
);

然后再生成scaffold(包括model,controller,test,4個views等等)。

而Django的做法是,編寫下面的Model類:

depot/depotapp/models.py:

from django.db import models

class Product(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
image_url = models.CharField(max_length=200)
price = models.DecimalField(max_digits=8,decimal_places=2)

如同其他的ORM,ID字段是默認聲明的,不需要單獨處理.

 

 

部署模型
Django 中的每一件事情都需要明確聲明,也就是說,沒有你的允許,Django不會主動去碰你的代碼。所以我們還需要在project中進行一些配置工作才能讓app生效。
不過這樣的配置只需要做一次。

首先要創建數據庫並配置整個project的數據庫連接,為了簡單起見,使用sqlite數據庫。
在工程文件夾下創建db文件夾和sqlite數據庫文件:

$mkdir db
$cd db
$sqlite3 development.sqlite3

然后修改配置文件settings.py, 將DATABASES改為:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'db/development.sqlite3',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}

就完成了數據庫的配置。

還需要配置project讓depotapp生效,還是在settings.py中,將INSTALLED_APPS改為:

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',
'depot.depotapp',
)


接下來就可以使用模型了。先驗證一下:
$python manage.py validate
0 errors found


然后可以看一下這個Model將會生成什么樣的數據庫:
$ python manage.py sqlall depotapp
BEGIN;
CREATE TABLE "depotapp_product" (
    "id" integer NOT NULL PRIMARY KEY,
    "title" varchar(100) NOT NULL,
    "description" text NOT NULL,
    "image_url" varchar(200) NOT NULL,
    "price" decimal NOT NULL
)
;
COMMIT;


最后,將模型導入數據庫:
$ python manage.py syncdb
Creating tables ...
Creating table depotapp_product
Installing custom SQL ...
Installing indexes ...
No fixtures found.


至此,完成了第一個模型類的創建。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM