Django模型(一)
Django模型(一)
文章目錄
- Django模型(一)
- 一、配置Django使用mysql數據庫
- 二、案例
- 1.定義模型類
- 2.打開booktest/models.py文件
- 3.遷移
- 4.測試數據
- 5.定義視圖
- 6.配置url
- 7.創建模板
- 8.運行
- 三、定義屬性
- 1.Django根據屬性的類型確定以下信息:
- 2.屬性命名限制:
- 3.字段類型
- 4.選項
- 5.查詢函數
- 6.綜合演示
- O(objects):類和對象。
- R(Relation):關系,關系數據庫中的表格。
- M(Mapping):映射。
Django ORM框架的功能: - a)建立模型類和表之間的對應關系,允許我們通過面向對象的方式來操作數據庫。
- b)根據設計的模型類生成數據庫中的表格。
- c)通過方便的配置就可以進行數據庫的切換。
一、配置Django使用mysql數據庫
- 1.進入虛擬環境py_django。
- 2.在/home/python/pytest目錄下創建項目test2。
- 3.打開test2/settings.py文件,找到DATABASES項,默認使用SQLite3數據庫
修改為使用MySQL數據庫,代碼如下:
將引擎改為mysql,
提供連接的主機HOST
端口PORT
數據庫名NAME
用戶名USER
密碼PASSWORD。
- 4.數據庫切換成了mysql,需要安裝pymysql模塊之后,Django框架才可以操作mysql數據庫。安裝命令如下:
- 5.安裝成功之后,在test2/_init_.py文件中加上如下代碼:
注意:數據庫test2 Django框架不會自動生成,需要我們自己進入mysql數據庫去創建。
- 6.下面是手動創建數據庫,打開新終端,在命令行登錄mysql,創建數據庫test2。
注意:設置字符集為utf8
create database test2 charset=utf8;- 7.返回第一個終端,進入test2目錄,創建應用booktest。
- 8.將應用booktest注冊到項目中:打開test2/settings.py文件,找到INSTALLED_APPS項,加入如下代碼:
二、案例
1.定義模型類
- 模型類被定義在"應用/models.py"文件中,此例中為"booktest/models.py"文件。
- 模型類必須繼承自Model類,位于包django.db.models中。
- 提示:對于重要數據使用邏輯刪除。
2.打開booktest/models.py文件
定義模型類如下
from django.db import models#定義圖書模型類BookInfo class BookInfo(models.Model):btitle = models.CharField(max_length=20)#圖書名稱bpub_date = models.DateField()#發布日期bread = models.IntegerField(default=0)#閱讀量bcomment = models.IntegerField(default=0)#評論量isDelete = models.BooleanField(default=False)#邏輯刪除#定義英雄模型類HeroInfo class HeroInfo(models.Model):hname = models.CharField(max_length=20)#英雄姓名hgender = models.BooleanField(default=True)#英雄性別isDelete = models.BooleanField(default=False)#邏輯刪除hcomment = models.CharField(max_length=200)#英雄描述信息hbook = models.ForeignKey('BookInfo')#英雄與圖書表的關系為一對多,所以屬性定義在英雄模型類中3.遷移
- 生成遷移文件
- 然后執行如下命令
- 打開數據庫的命令行,查看當前所有表如下圖:
- 表bookinfo結構如:
默認值并不在數據庫層面生效,而是在django創建對象時生效。
- 表booktest_heroinfo結構如下:
Django框架會根據關系屬性生成一個關系字段,并創建外鍵約束。
4.測試數據
在數據庫命令行中,復制如下語句執行,向booktest_bookinfo表中插入測試數據:
insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values ('射雕英雄傳','1980-5-1',12,34,0), ('天龍八部','1986-7-24',36,40,0), ('笑傲江湖','1995-12-24',20,80,0), ('雪山飛狐','1987-11-11',58,24,0);向booktest_heroinfo表中插入測試數據:
insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values ('郭靖',1,1,'降龍十八掌',0), ('黃蓉',0,1,'打狗棍法',0), ('黃藥師',1,1,'彈指神通',0), ('歐陽鋒',1,1,'蛤蟆功',0), ('梅超風',0,1,'九陰白骨爪',0), ('喬峰',1,2,'降龍十八掌',0), ('段譽',1,2,'六脈神劍',0), ('虛竹',1,2,'天山六陽掌',0), ('王語嫣',0,2,'神仙姐姐',0), ('令狐沖',1,3,'獨孤九劍',0), ('任盈盈',0,3,'彈琴',0), ('岳不群',1,3,'華山劍法',0), ('東方不敗',0,3,'葵花寶典',0), ('胡斐',1,4,'胡家刀法',0), ('苗若蘭',0,4,'黃衣',0), ('程靈素',0,4,'醫術',0), ('袁紫衣',0,4,'六合拳',0);5.定義視圖
打開booktest/views.py文件,定義視圖代碼如下:
from django.shortcuts import render,redirect from booktest.models import * from datetime import date#查詢所有圖書并顯示 def index(request):list=BookInfo.objects.all()return render(request,'booktest/index.html',{'list':list})#創建新圖書 def create(request):book=BookInfo()book.btitle = '流星蝴蝶劍'book.bpub_date = date(1995,12,30)book.save()#轉向到首頁return redirect('/')#邏輯刪除指定編號的圖書 def delete(request,id):book=BookInfo.objects.get(id=int(id))book.delete()#轉向到首頁return redirect('/')6.配置url
打開test2/urls.py文件,配置url如下:
from django.conf.urls import include, url from django.contrib import adminurlpatterns = [url(r'^admin/', include(admin.site.urls)),#引入booktest的url配置url(r'^',include('booktest.urls')), ]在booktest應用下創建urls.py文件,代碼如下:
from django.conf.urls import url from booktest import viewsurlpatterns=[url(r'^$',views.index),url(r'^delete(\d+)/$',views.delete),url(r'^create/$',views.create), ]7.創建模板
打開test2/settings.py文件,配置模板查找目錄TEMPLATES的DIRS。
'DIRS': [os.path.join(BASE_DIR,'templates')],
創建templates/booktest/index.html文件。
模板代碼如下:
8.運行
運行服務器。
python manage.py runserver在瀏覽器中查看
操作效果如下圖
運行
在mysql命令行中查看數據表變化如下圖:
三、定義屬性
1.Django根據屬性的類型確定以下信息:
- 當前選擇的數據庫支持字段的類型
- 渲染管理表單時使用的默認html控件
- 在管理站點最低限度的驗證
- django會為表創建自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設置某屬性為主鍵列后django不會再創建自動增長的主鍵列。
- 默認創建的主鍵列屬性為id,可以使用pk代替,pk全拼為primary key。
注意:pk是主鍵的別名,若主鍵名為id2,那么pk是id2的別名。
2.屬性命名限制:
- 不能是python的保留關鍵字。
- 不允許使用連續的下劃線,這是由django的查詢方式決定的
- 定義屬性時需要指定字段類型,通過字段類型的參數指定選項,語法如下:
3.字段類型
使用時需要引入django.db.models包,字段類型如下:
- 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,對上傳的內容進行校驗,確保是有效的圖片。
4.選項
通過選項實現對字段的約束,選項如下:
- null:如果為True,表示允許為空,默認值是False。
- blank:如果為True,則該字段允許為空白,默認值是False。
- 對比:null是數據庫范疇的概念,blank是表單驗證范疇的。
- db_column:字段的名稱,如果未指定,則使用屬性的名稱。
- db_index:若值為True, 則在表中會為此字段創建索引,默認值是False。
- default:默認值。
- primary_key:若為True,則該字段會成為模型的主鍵字段,默認值是False,一般作為AutoField的選項使用。
- unique:如果為True, 這個字段在表中必須有唯一值,默認值是False。
對比:null是數據庫范疇的概念,blank是后臺管理頁面表單驗證范疇的。
經驗:
當修改模型類之后,如果添加的選項不影響表的結構,則不需要重新做遷移,商品的選項中default和blank不影響表結構。
5.查詢函數
通過模型類.objects屬性可以調用如下函數,實現對模型類對應的數據表的查詢。
6.綜合演示
修改booktest/models.py中的模型類,代碼如下:
from django.db import models#定義圖書模型類BookInfo class BookInfo(models.Model):#btitle = models.CharField(max_length=20)#圖書名稱btitle = models.CharField(max_length=20, db_column='title')#通過db_column指定btitle對應表格中字段的名字為titlebpub_date = models.DateField()#發布日期bread = models.IntegerField(default=0)#閱讀量bcomment = models.IntegerField(default=0)#評論量isDelete = models.BooleanField(default=False)#邏輯刪除#定義英雄模型類HeroInfo class HeroInfo(models.Model):hname = models.CharField(max_length=20)#英雄姓名hgender = models.BooleanField(default=True)#英雄性別isDelete = models.BooleanField(default=False)#邏輯刪除#hcomment = models.CharField(max_length=200)#英雄描述信息hcomment = models.CharField(max_length=200, null=True, blank=False) #hcomment對應的數據庫中的字段可以為空,但通過后臺管理頁面添加英雄信息時hcomment對應的輸入框不能為空hbook = models.ForeignKey('BookInfo')#英雄與圖書表的關系為一對多,所以屬性定義在英雄模型類中然后生成遷移文件并執行遷移命令,最后查看test2數據庫中的內容。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的Django模型(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django视图、URL、模版简介
- 下一篇: Django模型(二)