日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Django框架——模型(数据库操作)

發(fā)布時間:2023/11/29 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django框架——模型(数据库操作) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

-- 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。