標籤:models py
-- 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 modelsclass Person(models.Model):# 這個模型類裡面有一個屬性叫做personperson = 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__方法,因為父類已經使用建立了很多東西;# 所以,我們通過在模型類中使用類方法;@classmethoddef create(cls, btitle, bpub_date):b = BookInfob.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.Avg2.Count# 查詢總數的時候一般不使用;# BookInfo.objects.count() 替代;3.Max4.Min5.Sumbookinfo20 = 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架構——模型(資料庫操作)