Django框架——模型(数据库操作)
-- models.py
-- ORM(object-relation mapping) 實(shí)現(xiàn)數(shù)據(jù)模型與數(shù)據(jù)庫的解耦;
# 對象,關(guān)系,映射;
1.根 據(jù)對象的類型生成表結(jié)構(gòu);
2.將對象、列表的操作,轉(zhuǎn)換為sql語句;
3.將sql查詢到的結(jié)果轉(zhuǎn)換為對象、列表;
-- 字段類型
# 所有字段類型被定義在django.db.models.fields目錄下,
# 方便使用,被導(dǎo)入到django.db.models中;
1.AutoField 自動增長 # 通常不用指定
2.BooleanField 布爾類型
3.NullBooleanField 支持布爾值與null
4.CharField(max_length=長度) 字符串 # 必須指定最大長度
5.TextFeild 大文本字段
6.IntegerField 整數(shù)
7.DecimalField(max_digits=None,decimal_places=None) # 浮點(diǎn)數(shù),總位數(shù),小數(shù)位數(shù)
8.DateField([auto_now=False, auto_now_add=False]) # 保存對象時間;創(chuàng)建對象時間;
9.TimeField 時間 # 同DateField
10.DateTimeField 日期時間 # 同DateField
11.FileField 上傳文件時間
12.ImageField # 繼承與FileField,對上傳內(nèi)容進(jìn)行校驗(yàn)
13.BigIntegerField 64位整數(shù)
14.SmallIntegerField
-- 字段命名限制
1.非python保留字
2.不能有連續(xù)下劃線,查詢中有;
-- 字段選項(xiàng)(數(shù)據(jù)庫中的約束)
1.null?
2.blank
3.db_column? # 自定義字段名
4.db_index
5.default
6.primary_key
7.unique
-- 關(guān)系字段類型
1.ForeignKey 一對多
manufacturer.car_set.all()
2.OneToOneField 一對一
3.ManyToManyField 多對多
-- 元選項(xiàng)
#?創(chuàng)建模型類之后自定義表名 class?Meta: '''自定義表名''' db_table?=?'bookinfo' #?在生成遷移之后的0001——initial.py文件中多處一個; #?option={ 'db_table':'bookinfo'? #?表示表的名字已經(jīng)被自定義了; #?默認(rèn)生成的表的名字是:應(yīng)用名_小寫的模型類名; #?如:booktest_heroinfo; } #?表示當(dāng)前不是模型類,模型不會被用來創(chuàng)建所有數(shù)據(jù)表 class?Meta: '''表示當(dāng)前類不是模型類,而是其他模型的抽象基類''' abstract?=?True #?繼承模型類,調(diào)用其方法-- 測試數(shù)據(jù)
#?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), #?('梅超風(fēng)',0,1,'九陰白骨爪',0), #?('喬峰',1,2,'降龍十八掌',0), #?('段譽(yù)',1,2,'六脈神劍',0), #?('虛竹',1,2,'天山六陽掌',0), #?('王語嫣',0,2,'神仙姐姐',0), #?('令狐沖',1,3,'獨(dú)孤九劍',0), #?('任盈盈',0,3,'彈琴',0), #?('岳不群',1,3,'華山劍法',0), #?('東方不敗',0,3,'葵花寶典',0), #?('胡斐',1,4,'胡家刀法',0), #?('苗若蘭',0,4,'黃衣',0), #?('程靈素',0,4,'醫(yī)術(shù)',0), #?('袁紫衣',0,4,'六合拳',0);-- 模型類方法
1.str方法 #?返回模型類對象的描述 2.save方法 #?將對象保存至數(shù)據(jù)庫 3.delete方法 #?級聯(lián)刪除?? user=models.ForeignKey(user,blank=True,null=True,on_delete=models.SET_NULL) #?沒看懂-- 管理器(模型的成員)
#?模型類的屬性,將對象與數(shù)據(jù)表映射;-- 類的屬性
#?objects是Manager類型的對象,django中定義好的類,用于數(shù)據(jù)庫的交互; #?如果沒有指定,默認(rèn)提供一個管理器objects;-- 修改管理器名稱(默認(rèn)objects)
#?models.py文件中 from?django.db?import?models class?Person(models.Model): #?這個模型類里面有一個屬性叫做person person?=?models.Mangager() #?在Manager()類中完成字段信息的映射;-- 自定義管理器
# 默認(rèn)管理器方法太少,可以通過自定義管理器來新增方法;
-- 修改管理器返回的原始查詢集
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__方法,因?yàn)楦割愐呀?jīng)使用創(chuàng)建了很多東西; #?所以,我們通過在模型類中使用類方法; @classmethod def?create(cls,?btitle,?bpub_date): b?=?BookInfo b.btitle?=?btitle ... return?b 或者: 在自定義管理器中添加上面的方法;(推薦使用)-- 查詢
-- 獲取所有對象
object1?=?表名.objects.all() #?bookinfo?=?BookInfo.objects.all() #?可以通過切片選擇范圍內(nèi)對象(限制查詢集合) object2?=?表名.objects.all()[1,3]-- 過濾器(查詢集的方法)
-- 條件查詢
1.filter()?#?滿足查詢,始終返回一個查詢集,列表 2.exclude()?#?不滿足查詢 3.order_by() 4.values()?? 5.all()-- 語法規(guī)則:
#?表名.objects.filter(字段名__運(yùn)算符判斷='值')-- 運(yùn)算符
1.exact??#?精確匹配 2.contains??#?包含 3.startswith??#?以指定值開頭 4.endswith??#?以指定值結(jié)束 5.isnull??#?不為空 6.in??#?范圍內(nèi)查詢 7.gt/gte/lt/lte #?運(yùn)算符前加上i,不區(qū)分大小寫;-- 例子?
#?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) #?查詢大小范圍內(nèi)的字段值 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如果查詢的不僅一個對象,會觸發(fā)MultipleObjectsReturned異常 bookinfo12?=?BookInfo.objects.get(id__gt=2) print(bookinfo12) #?get如果查詢不到對象,會觸發(fā)DoesNotExist異常 bookinfo13?=?BookInfo.objects.get(book_title?=?'天龍七部') print(bookinfo13) --?count() --?first() --?last() --?exists()-- F對象和Q對象
# 需要導(dǎo)入模塊中的對象
from django.db.models import F, Q
-- F對象
#?實(shí)現(xiàn)兩個屬性之間的比較 bookinfo14?=?BookInfo.objects.filter(book_read__gte=F('book_comment')) print(bookinfo14) #?可以在F()對象上使用算數(shù)運(yùn)算 bookinfo15?=?BookInfo.objects.filter(book_read__gte=F('book_comment')*2) print(bookinfo15)-- Q對象(query查詢)
#?構(gòu)造查詢對象 --?邏輯與:多個過濾器逐個調(diào)用 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對象實(shí)現(xiàn),或與非 --?基本語法 Q(屬性名__運(yùn)算符=值) #?&表示邏輯與,|表示邏輯或 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)-- 聚合函數(shù)
#?需要導(dǎo)入模塊 from?django.db.models?import?* 表名.objects.aggregate(Sum(字段名)) 1.Avg 2.Count #?查詢總數(shù)的時候一般不使用; #?BookInfo.objects.count()?替代; 3.Max 4.Min 5.Sum bookinfo20?=?BookInfo.objects.aggregate(Sum('book_read')) print(bookinfo20)-- 關(guān)聯(lián)查詢
-- 一對多,一類
1.獲取單一字段對象 object1?=?表名.objects.get('條件') #?book?=?BookInfo.objects.get(id=1) 2.獲取對應(yīng)所有所有對象信息 object2?=?object1.小寫表名_set.all() #?heroes?=?book.heroinfo_set.all()-- 多對一,多類
1.獲取單一字段對象 object1?=?表名.objects.get('條件') #?hero?=?HeroInfo.objects.get(id=1) 2.獲取對應(yīng)對象信息 object1.字段屬性 #?hero.hero_book-- 通過模型類實(shí)現(xiàn)關(guān)聯(lián)查詢
# 暫略
-- 自關(guān)聯(lián)
# 略
轉(zhuǎn)載于:https://blog.51cto.com/13269293/1971208
總結(jié)
以上是生活随笔為你收集整理的Django框架——模型(数据库操作)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到给别人买车是什么意思
- 下一篇: MySQL purge 线程