Django框架——模型(數據庫操作)
-- models.py
-- ORM(object-relation mapping) 實現數據模型與數據庫的解耦;
# 對象,關系,映射;
1.根 據對象的類型生成表結構;
2.將對象、列表的操作,轉換為sql語句;
3.將sql查詢到的結果轉換為對象、列表;
-- 字段類型
# 所有字段類型被定義在django.db.models.fields目錄下,
# 方便使用,被導入到django.db.models中;
1.AutoField 自動增長 # 通常不用指定
2.BooleanField 布爾類型
3.NullBooleanField 支持布爾值與null
4.CharField(max_length=長度) 字符串 # 必須指定最大長度
5.TextFeild 大文本字段
6.IntegerField 整數
7.DecimalField(max_digits=None,decimal_places=None) # 浮點數,總位數,小數位數
8.DateField([auto_now=False, auto_now_add=False]) # 保存對象時間;創建對象時間;
9.TimeField 時間 # 同DateField
10.DateTimeField 日期時間 # 同DateField
11.FileField 上傳文件時間
12.ImageField # 繼承與FileField,對上傳內容進行校驗
13.BigIntegerField 64位整數
14.SmallIntegerField
-- 字段命名限制
1.非python保留字
2.不能有連續下劃線,查詢中有;
-- 字段選項(數據庫中的約束)
1.null
2.blank
3.db_column # 自定義字段名
4.db_index
5.default
6.primary_key
7.unique
-- 關系字段類型
1.ForeignKey 一對多
manufacturer.car_set.all()
2.OneToOneField 一對一
3.ManyToManyField 多對多
-- 元選項
# 創建模型類之後自定義表名 class Meta: ‘‘‘自定義表名‘‘‘ db_table = ‘bookinfo‘ # 在生成遷移之後的0001——initial.py文件中多處一個; # option={ ‘db_table‘:‘bookinfo‘ # 表示表的名字已經被自定義了; # 默認生成的表的名字是:應用名_小寫的模型類名; # 如:booktest_heroinfo; } # 表示當前不是模型類,模型不會被用來創建所有數據表 class Meta: ‘‘‘表示當前類不是模型類,而是其他模型的抽象基類‘‘‘ abstract = True # 繼承模型類,調用其方法
-- 測試數據
# class BookInfo(models.Model): # btitle = models.CharField(max_length=20) # bpub_date = models.DateTimeField() # bread = models.IntegerField(default=0) # bcomment = models.IntegerField(default=0) # isDelete = models.BooleanField(default=False) # class Meta: # db_table = ‘bookinfo‘ # class HeroInfo(models.Model): # hname = models.CharField(max_length=20) # hgender = models.BooleanField(default=True) # isDelete = models.BooleanField(default=False) # hcontent = models.CharField(max_length=100) # hbook = models.ForeignKey(‘BookInfo‘) # insert into 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); # insert into model_heroinfo(hname,hgender,hbook_id,hcontent,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);
-- 模型類方法
1.str方法 # 返回模型類對象的描述 2.save方法 # 將對象保存至數據庫 3.delete方法 # 級聯刪除 user=models.ForeignKey(user,blank=True,null=True,on_delete=models.SET_NULL) # 沒看懂
-- 管理器(模型的成員)
# 模型類的屬性,將對象與數據表映射;
-- 類的屬性
# objects是Manager類型的對象,django中定義好的類,用於數據庫的交互; # 如果沒有指定,默認提供一個管理器objects;
-- 修改管理器名稱(默認objects)
# models.py文件中 from django.db import models class Person(models.Model): # 這個模型類裏面有一個屬性叫做person person = models.Mangager() # 在Manager()類中完成字段信息的映射;
-- 自定義管理器
# 默認管理器方法太少,可以通過自定義管理器來新增方法;
-- 修改管理器返回的原始查詢集
class BookInfoManager(models.Manager): def get_queryset(self): return super(BookInfoManager, self).get_queryset().filter(isDelete=False) # 修改父類Manager中的get_queryset()方法,在父類方法後面添加一個filter(isDelete=Fales); # super(BookInfoManager, self).get_queryset()表示父類的方法;
class BookInfo(models.Model): ... 字段賦值 books1 = BookInfoManger() # 表示重寫父類後,重新定義給新的管理器;
-- 向管理器類中添加額外的方法
# 模型類中無法再使用__init__方法,因為父類已經使用創建了很多東西; # 所以,我們通過在模型類中使用類方法; @classmethod def create(cls, btitle, bpub_date): b = BookInfo b.btitle = btitle ... return b 或者: 在自定義管理器中添加上面的方法;(推薦使用)
-- 查詢
-- 獲取所有對象
object1 = 表名.objects.all() # bookinfo = BookInfo.objects.all() # 可以通過切片選擇範圍內對象(限制查詢集合) object2 = 表名.objects.all()[1,3]
-- 過濾器(查詢集的方法)
-- 條件查詢
1.filter() # 滿足查詢,始終返回一個查詢集,列表 2.exclude() # 不滿足查詢 3.order_by() 4.values() 5.all()
-- 語法規則:
# 表名.objects.filter(字段名__運算符判斷=‘值‘)
-- 運算符
1.exact # 精確匹配 2.contains # 包含 3.startswith # 以指定值開頭 4.endswith # 以指定值結束 5.isnull # 不為空 6.in # 範圍內查詢 7.gt/gte/lt/lte # 運算符前加上i,不區分大小寫;
-- 例子
# filter()過濾器 # 精確查詢 bookinfo_3 = BookInfo.objects.filter(id__exact=1) print(bookinfo_3) # 包含查詢 bookinfo4 = BookInfo.objects.filter(book_title__contains=‘八‘) print(bookinfo4) # 首字查詢 bookinfo5 = BookInfo.objects.filter(book_title__startswith=‘天‘) print(bookinfo5) # 尾字查詢 bookinfo6 = BookInfo.objects.filter(book_title__endswith=‘傳‘) print(bookinfo6) # 查看不為空的字段值 bookinfo7 = BookInfo.objects.filter(book_title__isnull=False) print(bookinfo7) # 查詢指定編號範圍的字段值 bookinfo8 = BookInfo.objects.filter(pk__in=[1,3]) print(bookinfo8) # 查詢大小範圍內的字段值 bookinfo9 = BookInfo.objects.filter(id__gt=3) print(bookinfo9) # exclude()過濾器 bookinfo10 = BookInfo.objects.exclude(id__gt=3) print(bookinfo10)
-- 返回單個值的方法
-- get 獲取單一對象
bookinfo11 = BookInfo.objects.get(book_title = ‘天龍八部‘) print(bookinfo11) # get如果查詢的不僅一個對象,會觸發MultipleObjectsReturned異常 bookinfo12 = BookInfo.objects.get(id__gt=2) print(bookinfo12) # get如果查詢不到對象,會觸發DoesNotExist異常 bookinfo13 = BookInfo.objects.get(book_title = ‘天龍七部‘) print(bookinfo13) -- count() -- first() -- last() -- exists()
-- F對象和Q對象
# 需要導入模塊中的對象
from django.db.models import F, Q
-- F對象
# 實現兩個屬性之間的比較 bookinfo14 = BookInfo.objects.filter(book_read__gte=F(‘book_comment‘)) print(bookinfo14) # 可以在F()對象上使用算數運算 bookinfo15 = BookInfo.objects.filter(book_read__gte=F(‘book_comment‘)*2) print(bookinfo15)
-- Q對象(query查詢)
# 構造查詢對象 -- 邏輯與:多個過濾器逐個調用 bookinfo16 = BookInfo.objects.filter(book_read__lte=40, id__lte=3) print(bookinfo16) bookinfo17 = BookInfo.objects.filter(book_read__lte=40).filter(id__lte=3) print(bookinfo17) -- 利用Q對象實現,或與非 -- 基本語法 Q(屬性名__運算符=值) # &表示邏輯與,|表示邏輯或 bookinfo18 = BookInfo.objects.filter(Q(book_read__lte=40) & Q(id__lte=3)) print(bookinfo18) bookinfo19 = BookInfo.objects.filter(Q(book_read__lte=40) | Q(id__lte=3)) print(bookinfo19)
-- 聚合函數
# 需要導入模塊 from django.db.models import * 表名.objects.aggregate(Sum(字段名)) 1.Avg 2.Count # 查詢總數的時候一般不使用; # BookInfo.objects.count() 替代; 3.Max 4.Min 5.Sum bookinfo20 = BookInfo.objects.aggregate(Sum(‘book_read‘)) print(bookinfo20)
-- 關聯查詢
-- 一對多,一類
1.獲取單一字段對象 object1 = 表名.objects.get(‘條件‘) # book = BookInfo.objects.get(id=1) 2.獲取對應所有所有對象信息 object2 = object1.小寫表名_set.all() # heroes = book.heroinfo_set.all()
-- 多對一,多類
1.獲取單一字段對象 object1 = 表名.objects.get(‘條件‘) # hero = HeroInfo.objects.get(id=1) 2.獲取對應對象信息 object1.字段屬性 # hero.hero_book
-- 通過模型類實現關聯查詢
# 暫略
-- 自關聯
# 略
Django框架——模型(數據庫操作)