Django框架(二):設計模型

1. 設計模型

咱們以前操做數據庫是經過寫sql語句,那麼能不能不寫sql語句就能夠操做數據庫呢? 固然能夠,這就要使用ORM框架了。python

1.1 ORM框架

O是object,也就類對象的意思,R是relation,翻譯成中文是關係,也就是關係數據庫中數據表的意思,M是mapping,是映射的意思。在ORM框架中,它幫咱們把類和數據表進行了一個映射,可讓咱們經過類和類對象就能操做它所對應的表格中的數據。ORM框架還有一個功能,它能夠根據咱們設計的類自動幫咱們生成數據庫中的表格,省去了咱們本身建表的過程。mysql

django中內嵌了ORM框架,不須要直接面向數據庫編程,而是定義模型類,經過模型類和對象完成數據表的增刪改查操做。sql

使用django進行數據庫開發有三個步驟:shell

1.在models.py中定義模型類數據庫

2.遷移django

3.經過類和對象完成數據增刪改查操做編程

下面咱們就以保存圖書信息爲例來給你們介紹Django中進行數據庫開發的整個流程。session

1.2 建立模型

在booktest下的models.py中建立模型,須要繼承models.Model類:app

from django.db import models
#設計和表對應的類 模型類
# Create your models here.

#圖書類
class BookInfo(models.Model):
    '''圖書模型類'''
    #圖書名稱 CharField說明是一個字符串 max_length指定字符串的最大長度
    btitle = models.CharField(max_length=20)
    #出版日期 DateField說明是一個日期類型
    bpub_date = models.DateField()

1.3 遷移

遷移有兩步:框架

1.生成遷移文件:根據模型類生成建立表的遷移文件。

2.執行遷移:根據第一步生成的遷移文件在數據庫中建立表。

生成遷移文件命令以下:

 python manage.py makemigrations

執行生成遷移文件命令後,會在應用booktest目錄下的migrations目錄中生成遷移文件。 

咱們打開這個文件,內容以下:

# Generated by Django 3.0.2 on 2020-01-15 07:01

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='BookInfo',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('btitle', models.CharField(max_length=20)),
                ('bpub_date', models.DateField()),
            ],
        ),
    ]

Django框架根據咱們設計的模型類生成了遷移文件,在遷移文件中咱們能夠看到fields列表中每個元素跟BookInfo類屬性名以及屬性的類型是一致的。同時咱們發現多了一個id項,這一項是Django框架幫咱們自動生成的,在建立表的時候id就會做爲對應表的主鍵列,而且主鍵列自動增加。

當執行遷移命令後,Django框架會讀取遷移文件自動幫咱們在數據庫中生成對應的表格。 

 

Django默認採用sqlite3數據庫,上圖中的db.sqlite3就是Django框架幫咱們自動生成的數據庫文件。 sqlite3是一個很小的數據庫,一般用在手機中,它跟mysql同樣,咱們也能夠經過sql語句來操做它。 

可是咱們通常是使用mysql做爲案例的,因此咱們須要將模型轉爲mysql數據庫中的表。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'bms',        # 要鏈接的數據庫,鏈接前須要建立好
        'USER':'root',       # 鏈接數據庫的用戶名
        'PASSWORD':'root',       # 鏈接數據庫的密碼
        'HOST':'127.0.0.1', # 鏈接主機,默認本機
        'PORT':3306           # 端口 默認3306
    }
}

NAME即數據庫的名字,在mysql鏈接前該數據庫必須已經建立,而上面的sqlite數據庫下的db.sqlite3則是項目自動建立 USER和PASSWORD分別是數據庫的用戶名和密碼。設置完後,再啓動咱們的Django項目前,咱們須要激活咱們的mysql。而後,啓動項目,會報錯:no module named MySQLdb 。這是由於django默認你導入的驅動是MySQLdb,但是MySQLdb對於py3有很大問題,因此咱們須要的驅動是PyMySQL。因此咱們還須要找到項目名下的__init__,在裏面寫入:

import pymysql
pymysql.install_as_MySQLdb()

而後咱們還要注意一個報錯,報錯以下:

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

MySQLclient目前只支持到python3.4,所以若是使用的更高版本的python,須要修改以下:

經過路徑查找E:\pythondaima\venv\Lib\site-packages\django\db\backends\mysql\base..py。在這個路徑下找到以下地方:

註釋掉就OK了。 

還有就是上一章講過的,確保配置文件中的INSTALLED_APPS中寫入咱們建立的app名稱。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booktest',
]

刪除原來生成的文件,從新運行兩條命令:

python manage.py makemigrations

python manage.py migrate

咱們能夠看到生成的表名叫作booktest_bookinfo,booktest是應用的名字,bookinfo是模型類的名字。

咱們再弄個角色類:

在booktest/models.py,定義角色類:

class RoleInfo(models.Model):
    '''角色人物模型類'''
    # 角色名
    rname = models.CharField(max_length=20)
    # 性別
    rgender = models.BooleanField()
    # 備註
    rcomment = models.CharField(max_length=100)
    # 關係屬性
    rbook = models.ForeignKey('BookInfo',on_delete=models.CASCADE)

在外鍵值的後面加上 on_delete=models.CASCADE,由於在django2.0後,定義外鍵和一對一關係的時候須要加on_delete選項,此參數爲了不兩個表裏的數據不一致問題,否則會報錯。

這裏要說明的是,BookInfo類和RoleInfo類之間具備一對多的關係,這個一對多的關係應該定義在多的那個類,也就是RoleInfo類中。

在咱們以後遷移生成表的時候,Django框架就會自動幫咱們在圖書表和角色表之間創建一個外鍵關係。

python manage.py makemigrations

python manage.py migrate

1.4 操做數據庫

1.4.1 單表操做

完成數據表的遷移以後,下面就能夠經過進入項目的shell,進行簡單的API操做。若是須要退出項目,可使用ctrl+d快捷鍵或輸入quit()。

進入項目shell的命令:

python manage.py shell

首先引入booktest/models中的類:

from booktest.models import BookInfo,RoleInfo

查詢全部圖書信息:

BookInfo.objects.all()

由於當前並無數據,因此返回空列表。

新建圖書對象: 

b=BookInfo()
b.btitle="斗羅大陸"
from datetime import date
b.bpub_date=date(2008,12,14)
b.save()

再次查詢全部圖書信息:

BookInfo.objects.all()

查找圖書信息並查看值:

b=BookInfo.objects.get(id=1)
b
b.id
b.btitle
b.bpub_date

修改圖書信息:

b.bpub_date=date(2017,1,1)
b.save()
b.bpub_date

刪除圖書信息:

b.delete()

1.4.2 多表關聯操做

對於RoleInfo能夠按照上面的方式進行增刪改查操做。

建立一個BookInfo對象

b=BookInfo()
b.btitle='abc'
b.bpub_date=date(2017,1,1)
b.save()

建立一個RoleInfo對象

r=RoleInfo()
r.rname='a1'
r.rgender=False
r.rcomment='he is a boy'
r.rbook=b
r.save()

圖書與角色是一對多的關係,django中提供了關聯的操做方式。

得到關聯集合:返回當前book對象的全部role。

b.roleinfo_set.all()

相關文章
相關標籤/搜索