在web應用中,經常涉及到和數據庫的的交互,比如我們在京東上買一個東西,查詢的時候網站會自動轉到后端數據庫去查詢,然后呈現在網頁上
Django 里更關注的是模型(Model)、模板(Template)和視圖(Views),Django 也被稱為 MTV 框架 。在 MTV 開發模式中:
M 代表模型(Model),即數據存取層。 該層處理與數據相關的所有事務: 如何存取、如何驗證有效性、包含哪些行為以及數據之間的關系等。
T 代表模板(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其他類型文檔中進行顯示。
V 代表視圖(View),即業務邏輯層。 該層包含存取模型及調取恰當模板的相關邏輯。 你可以把它看作模型與模板之間的橋梁。
對於數據庫,我們可以用Mysql進行存儲,如下面的代碼:
def book_list(request):
db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
cursor = db.cursor()
cursor.execute('SELECT name FROM books ORDER BY name')
names = [row[0] for row in cursor.fetchall()]
db.close()
return render('book_list.html', {'names': names})
但是每次進行存儲和取數據的時候都得進行數據庫連接,不是很方便。好在Django內置了繼承了sqlite數據庫。我們可以直接使用。在setting.py文件中有如下的默認定義,可以看到引擎使用的是sqlite3,路徑在工程路徑下,名字是db.sqlite3
在工程界面下,可以看到db.sqlite3文件
Django采用模型在后台執行SQL代碼並把結果用python的數據結果來描述。這樣的好處是你在寫處理函數的時候,只需要考慮python代碼,不用再Python和SQL代碼之間來回切換。另外由於django可以配置不同的數據庫,不同的數據庫平台存在兼容性問題,因此使用python描述數據結構可以適用不同的平台
下面我們就來建立自己的模型:
首先在models.py中定義如下數據模型:定義了3個模型,一個是出版商,一個是作者,一個是書籍。從定義中可以看出,每個類型包含不同的屬性。且每個屬性有不同的類型,比如是字符類的,時間類的。和數據庫語言差不多是類似的
比如SQL中建立一個表CREATE TABLE Publisher(name char(30),address char(30))。所以每個模型就可以認為是一個表
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
這里解釋下ForeignKey和ManyToManyFiled的用法。由於python的模型中封裝了數據庫的很多表示法,所以django定義了很多參數來表達數據庫之間的聯系
ForeignKey:一對多的關系。對於一個出版商來說,不可能只出版一本書,因此設置publisher = models.ForeignKey(Publisher)就將每本書和出版商關聯了起來。因此ForeignKey的一對多可以理解為一個出版商對應對本書
ManyToManyField:多對多的關系。在一本書里,也許作者並不至一個。有多個作者。那么對於Book來說,定義了authors可以查到這本書所有的作者。而對於Authors這個模型來說,也可以通過這個關聯反查到這個作者的所有書籍
另外每個模型都是models.Model的子類,它的父類Model包含了所有和數據庫進行交互的方法。
在pycharm的終端上執行python manage.py makemigrations App名字,可以看到系統開始創建數據表
D:\django_test2>python manage.py makemigrations site_prj
Migrations for 'site_prj':
site_prj\migrations\0001_initial.py:
- Create model Author
- Create model Book
- Create model Publisher
- Add field publisher to book
此時才生成initial.py文件
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Author',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=30)),
('last_name', models.CharField(max_length=30)),
('email', models.EmailField(max_length=254)),
],
),
migrations.CreateModel(
name='Book',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=50)),
('publish_date', models.DateField()),
('authors', models.ManyToManyField(to='site_prj.Author')),
],
),
migrations.CreateModel(
name='Publisher',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=30)),
('address', models.CharField(max_length=50)),
('city', models.CharField(max_length=20)),
('state_province', models.CharField(max_length=20)),
('country', models.CharField(max_length=30)),
('website', models.URLField()),
],
),
migrations.AddField(
model_name='book',
name='publisher',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='site_prj.Publisher'),
),
]
當定義了類型后,后面有需求有添加該如何處理呢。比如我們在出版商Publisher這個模型下面添加一個字段成立日期:
setup_date=models.DateField()
此時添加后,需要同步。在終端上執行python manage.py makemigrationsz首先進行遷移:出現如下提示。意思是這個變量沒有一個默認值,選擇1表示自行添加一個默認值
此時會進行python界面,輸入值后退出。我選擇的是timezone.now表示當前時間
再執行python manage.py migrate 進行遷移。如下所示,表示更新成功
本節介紹了模型的創建方法,后面將會介紹模型數據的獲取方法以及和網頁前端的交互