04-Django模型(1)

模型

  MTV圖解

 

 

 

 ORM

  ORM全拼:Object-Relation-Mapping翻譯就是對象關係映射。在MVC/MTV設計模式中的Model模塊中都包括ORM。主要實現模型對象到關係數據庫數據的映射。好比:把數據庫表中每條記錄映射爲一個模型對象html

 

 

  ORM圖解

 

 

 優勢:python

  只須要面向對象編程,不須要面向數據庫編寫代碼。對數據庫的操做都轉化爲對類屬性和方法的操做,不用編寫各類數據庫的sql語句mysql

  實現了數據模型與數據庫的解耦,屏蔽了不一樣數據庫操做上的差別。經過簡單地配置就能夠輕鬆更換數據庫,而不須要修改代碼。git

缺點:sql

  相比較直接使用SQL語句操做數據庫,有性能缺失。會轉化爲sql語句在執行。多了流程。根據對象的操做轉換成sql語句,根據查詢的結果轉化成對象,在映射過程當中有性能損失。數據庫

項目準備

    一、建立項目django

django-admin startproject BookManager

  二、建立應用編程

python manage.py startapp Book

  三、安裝應用設計模式

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

  四、本地化瀏覽器

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

  五、建立模板路徑

    在應用同級目錄下,建立templates模板文件

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        #模板路徑
        'DIRS': [os.path.join(BASE_DIR,"templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

六、應用中分發路由

from django.contrib import admin
from django.urls import path
from Book import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('booklist/', views.bookList),
]

七、準備視圖函數

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.


#書籍列表信息視圖
def bookList(request):
    return HttpResponse("ok")

八、開啓服務器,測試項目

python manage.py runserver

http://127.0.0.1:8000/

MYSQL數據庫

  Django項目默認採用sqlite3數據庫,可是Web項目首選的數據庫是mysql數據庫,因此咱們須要修改Django項目默認的數據庫爲mysql數據庫

安裝pymysql包

  pymysql包用於跟mysql數據庫交互,沒有pymysql包會報錯:Error loading MySQLdb module: No module named MySQLdb

pip3 install pymysql

pymysql包配置:

 

 

 

配置項目mysql數據庫(settings.py)

  默認配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

  配置mysql數據庫:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 數據庫引擎
        'NAME': 'Bookdb',  # 數據庫名稱
        'HOST': 'localhost',  # 數據庫主機(建議使用主機真實IP)
        'PORT': '3306',  # 數據庫端口
        'USER': 'root',  # 數據庫用戶名
        'PASSWORD': '',  # 數據庫密碼
    }
}

建立項目mysql數據庫

  打開cmd終端,打開數據庫,連接數據庫。建立數據庫名字:

create database bookdb charset=utf8;
  use Bookdb;
show tables;
#退出數據庫
exit

字段類型

  當爲項目建立好mysql類型的數據庫bookdb後,須要建立模型類並生成和執行遷移表,從而建立數據庫表。可是在建立模型類須要指定模型屬性和屬性類型。

  模型屬性和屬性類型,也就是對應數據庫中的字段和字段類型

模型類定義屬性:

  語法:屬性名 = models.字段類型(選項)

# 書籍信息模型
class Book(models.Model):
    name = models.CharField(max_length=20) #圖書名稱

備註:屬性名一、不容許使用python的保留關鍵字,二、不容許使用mysql的保留關鍵字,三、不容許使用連續的下劃線,由於Django的查詢語法就是連續的下劃線。

字段類型

AutoField:自動增加的IntegerField,一般不用指定,不指定時Django會自動建立屬性名爲id的自動增加屬性

BooleanField:布爾字段,值爲True或False
NullBooleanField:支持Null、True、False三種值
CharField(max_length
=字符長度):字符串參數max_length表示最大字符個數
TextField:大文本字段,通常超過4000個字符時使用
IntegerField:整數
DecimalField(max_digits
=None, decimal_places=None):能夠指定精度的十進制浮點數 參數max_digits表示總位數 參數decimal_places表示小數位數
FloatField:浮點數
DateField[auto_now
=False, auto_now_add=False]):日期,參數auto_now表示每次保存對象時,自動設置該字段爲當前時間,用於"最後一次修改"的時間戳,
它老是使用當前日期,默認爲false 參數auto_now_add表示當對象第一次被建立時自動設置當前時間,用於建立的時間戳,它老是使用當前日期,默認爲false 參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤
TimeField:時間,參數同DateField
DateTimeField:日期時間,參數同DateField
FileField:上傳文件字段
ImageField:繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片

選項

經過選項實現對字段的約束
null:若是爲True,表示容許爲空,默認值是False
blank:若是爲True,則該字段容許爲空白,默認值是False
對比:null是數據庫範疇的概念,blank是表單驗證範疇的
db_column:字段的名稱,若是未指定,則使用屬性的名稱
db_index:若值爲True, 則在表中會爲此字段建立索引,默認值是False
default:默認值
primary_key:若爲True,則該字段會成爲模型的主鍵字段,默認值是False,通常做爲AutoField的選項使用
unique:若是爲True, 這個字段在表中必須有惟一值,默認值是False
注意:Django會自動爲表建立主鍵字段 若是使用選項設置某屬性爲主鍵字段後,Django不會再建立自動增加的主鍵字段 默認建立的主鍵字段爲id,可使用pk代替,pk全拼爲primary key

關係字段類型

關係型數據庫的關係包括三種類型:
  ForeignKey:一對多,將字段定義在多的一端中   

  ManyToManyField:多對多,將字段定義在任意一端中
  

OneToOneField:一對一,將字段定義在任意一端中
能夠維護遞歸的關聯關係,使用self指定,詳見「自關聯」

元模型類

  做用:在模型類中定義 元類Meta,用於設置元信息,用db_table 自定義表的名字

 # 書籍信息模型
  class BookInfo(models.Model):
      name = models.CharField(max_length=20) #圖書名稱

      class Meta: #元信息類
          db_table = 'bookinfo' #自定義表的名字

#在數據庫中更改表名

查看錶結構(數據庫的客戶端查看)

desc 代表 

定義模型

  定義的模型能夠是這個樣子

#書籍信息
("與時間作朋友","2002-08-22","45.21","中信出版社","athor_id")

#人物信息
("李笑來","","年齡","家庭地址","電話")

所以模型代碼以下:

from django.db import models

# Create your models here.
#建立做者信息表
class Authors(models.Model):
    name = models.CharField(max_length=20)#做者名字
    gender = models.BooleanField(default=True)#性別
    age = models.IntegerField()#年齡
    addr = models.CharField(max_length=60)
    tel = models.IntegerField()
    #元類修改表名
    class Meta:
        db_table = "authors"

#建立書籍信息
class Books(models.Model):
    name = models.CharField(max_length=20)#書名
    pub_data = models.DateField(null=True)#出版日期
    #參數max_digits表示總位數 參數decimal_places表示小數位數
    price = models.DecimalField(max_digits=8,decimal_places=2)#價格
    publish = models.CharField(max_length=20)
    #外鍵 將字段定義在多的一端中 級聯刪除
    author = models.ForeignKey(Authors,on_delete=models.CASCADE)
    #修改表名(元類)
    class Meta:
        db_table = "books"

模型遷移不要忘記:

python manage.py makemigrations

python manage.py migrate

查看錶結構:

 

 

去站點插點數據(若是嫌慢就用sql語句插數據)(須要設置站點,一、註冊管理模型類,須要顯示完整的,重寫類,list_display從新註冊,啓動超級用戶,python manage.py createsuperuser)

 

 

 

 展現模型數據

  網址:http://127.0.0.1:8000/booklist

  路由部分:

from django.contrib import admin
from django.urls import path
from Book import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('booklist/', views.bookList),
]

  視圖部分:

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from Book.models import *

#書籍列表信息視圖
def bookList(request):
    #查詢數據庫書籍信息
    booklist = Books.objects.all()
    #構造上下文
    content = {"booklist":booklist}
    #傳入模板 返回由視圖發送給瀏覽器
    return render(request,"Book/booklist.html",content)

  模板部分:

from django.db import models

# Create your models here.
#建立做者信息表
class Authors(models.Model):
    name = models.CharField(max_length=20)#做者名字
    gender = models.BooleanField(default=True)#性別
    age = models.IntegerField()#年齡
    addr = models.CharField(max_length=60)
    tel = models.IntegerField()
    #元類修改表名
    class Meta:
        db_table = "authors"
    def __str__(self):
        return self.name
#建立書籍信息
class Books(models.Model):
    name = models.CharField(max_length=20)#書名
    pub_data = models.DateField(null=True)#出版日期
    #參數max_digits表示總位數 參數decimal_places表示小數位數
    price = models.DecimalField(max_digits=8,decimal_places=2)#價格
    publish = models.CharField(max_length=20)
    #外鍵 將字段定義在多的一端中 級聯刪除
    author = models.ForeignKey(Authors,on_delete=models.CASCADE)
    #修改表名(元類)
    class Meta:
        db_table = "books"

    def __str__(self):
        return self.name

   結果:

 

 

 模型中重要的實例方法和屬性

  模型實例方法

str : 在將對象轉換成字符串時會被調用

save : 將模型對象保存到數據庫表中

delete : 將模型對象從數據庫表中刪除

  objects模型屬性

objects : 管理器對象是Manager類型的對象,定義在from django.db import models中用於模型對象和數據庫交互
是默認自動生成的屬性,可是能夠自定義管理器對象自定義管理器對象後,Django再也不生成默認管理器對象objects

自定義管理器對象,本來默認的是objects = models.Manager(),能夠自定義,從新實例化管理器對象。

查詢操做

  • 查詢集:表示從數據庫中獲取的模型對象集合
    • 在管理器上調用過濾器方法會返回查詢集
    • 查詢集能夠含有0個、一個或多個過濾器
  • 過濾器:基於所給的參數限制查詢的結果
  • 提示:從sql的角度,查詢集和select語句等價,過濾器像where和limit語句

返回列表的過濾器以下: 

all():返回全部的數據
filter():返回知足條件的數據
exclude():返回知足條件以外的數據,至關於sql語句中where部分的not關鍵字
order_by():返回排序後的數據

返回單個對象的過濾器以下:

get():返回單個知足條件的對象
若是未找到會引起"模型類.DoesNotExist"異常
若是多條被返回,會引起"模型類.MultipleObjectsReturned"異常
count():返回當前查詢的總條數
aggregate():聚合
exists():判斷查詢集中是否有數據,若是有則返回True,沒有則返回False

查詢集的特色

  一、惰性執行:建立查詢集不會訪問數據庫,直到在模板中調用數據時,纔會訪問數據庫。

調用數據的狀況包括迭代、序列化、與if合用

  二、緩存:查詢集的結果被存下來以後,再次查詢相同數據時會使用以前緩存的數據

 每一個查詢集都包含一個緩存來最小化對數據庫的訪問,第一次查詢數據後,Django會將查詢集緩存起來,並返回請求的結果,再次查詢相同數據時將重用緩存的結果。

限制查詢集

  • 查詢集返回列表,可使用下標的方式進行限制,等同於sql中的limitoffset語句
  • 注意:不支持負數索引
  • 使用下標後返回一個新的查詢集,不會當即執行查詢
  • 若是獲取一個對象,直接使用[0],等同於[0:1].get()

    • 可是若是沒有數據,[0]引起IndexError異常,[0:1].get()引起DoesNotExist異常

基礎條件查詢

  查詢語法

filter(模型屬性__條件運算符=值)
例:
filter(name__contains='')

  說明:查詢語句是屬性名稱和比較運算符間使用兩個下劃線相連,因此定義的模型屬性名不能包括多個下劃線

  實現sql中where的功能,能夠調用過濾器filter()、exclude()、get()

  查詢需求

# 1.查詢id爲1的書籍
# 2.查詢書名包含‘時間’的書籍
# 3.查詢書名以‘觀’結尾的書籍
# 4.查詢書名不爲空的書籍
# 5.查詢價格爲50或52的書籍
# 6.查詢價格大於52的書籍
# 7.查詢id不等於3的書籍
# 8.查詢2019年發表的書籍
# 9.查詢2000年1月1往後發表的書籍

  查詢實現

1.查詢id爲1的書籍(exact:判斷相等)
 #一、查詢id爲1的書籍(exact: 判斷相等)<QuerySet [<Books: 與時間作朋友>]>
   book = Books.objects.all()
book1 = book.filter(id__exact=1)
2.查詢書名包含‘時間’的書籍(contains:是否包含)
    book = Books.objects.all()
    book1 = book.filter(name__contains="局觀")

#<QuerySet [<Books: 大局觀>]>

 
3.查詢書名以‘與’開始的書籍(startswith,endswith)
 book = Books.objects.all()
    book1 = book.filter(name__startswith="")
    print(book1)
 4.查詢書名不爲空的書籍(isnull:是否爲null)
 book = Books.objects.all()
    book1 = book.filter(name__isnull=False)
    print(book1)
5.查詢價格爲50或52的書籍(in:是否包含在這範圍內)
 book = Books.objects.all()
    book1 = book.filter(price__in=[50,52])
    print(book1)
6.查詢價格大於52的書籍(gt,gte,it,ite:大於,大於等於,小於,小於等於)
    book = Books.objects.all()
    book1 = book.filter(price__gt=52)
    print(book1)
 
 7.查詢id不等於3的書籍(exclude:條件之外的數據)
   book = Books.objects.all()
    book1 = book.exclude(id=3)
    print(book1)
 8.查詢2019年發表的書籍(year\month\day\week_day\hour\minute\second:對日期時間類型的屬性進行運算)
    book = Books.objects.all()
    book1 = book.filter(pub_data__year=2019)
    print(book1)
 9.查詢2000年1月1往後發表的書籍
   from datetime import date
    book = Books.objects.all()
    book1 = book.filter(pub_data__gt=date(2000,1,1))
    print(book1)

備註:

  • exactcontainsstartswithendswith運算符都區分大小寫
  • 在這些運算符前加上i表示不區分大小寫
    • iexacticontainsistartswithiendswith

 

其餘特殊查詢下一節分享總結(F和Q查詢,聚合函數,關聯查詢)
相關文章
相關標籤/搜索