-- 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
-- 通過模型類實現關聯查詢
# 暫略
-- 自關聯
# 略
轉載于:https://blog.51cto.com/13269293/1971208