jango框架之模型層(d77-78)
一 單表操做:
1 mysql數據庫:settings裏配置
'default': {
# key值必須都是大寫
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day76',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'admin',}
2 在init文件中:
import pymysql
pymysql.install_as_MySQLdb()
3 在models中,寫類,寫類的屬性
#自增,int,主鍵
id = models.AutoField(primary_key=True)
#varchar,長度32
name = models.CharField(max_length=32)
#Decimal 長度5,小數位2位
price = models.DecimalField(max_digits=5, decimal_places=2)
#日期類型,能夠爲空
create_data=models.DateField(null=True)
4 數據庫遷移:
python3 manage.py makemigrations --->只是對數據變動,作記錄
python3 manage.py migrate ---->把變動,同步到數據庫
python3 manage.py showmigrations ---->查看那個沒有提交到數據庫
5 新增表,刪除表,新增字段,刪除字段---->執行數據庫遷移的兩條命令就能夠了
6 單表增:
-兩種方式
7 單表修改:
-先查詢出來,而後update(queryset對象的方法)
-對象要更新,用save方法
8 單表刪除:
-先查詢出來,而後delete(queryset對象和模型對象的方法)
*****用queryset刪除,修改的時候,必定要注意,數據是幾條
-刪除數據表中全部數據:Book.objece.all().delete()
9 單表查詢
-all() 查詢全部結果
-filter(**kwargs) 與所給篩選條件相匹配的對象
-get(**kwargs) 有且只有一條數據,符合篩選條件的對象超過一個或者沒有都會拋出錯誤
-exclude(**kwargs) 與所給篩選條件不匹配的對象
-order_by(*field) 對查詢結果排序('-id') -*field 取反
-reverse() 查詢結果反向排序
-count() 數據庫中匹配查詢的對象數量
-first()
-last()
-exists() 包含數據,就返回True,不然返回False
-values(*field) 獲得的不是一系列model的實例化對象,而是一個可迭代的字典序列
-values_list(*field) 返回一個元組序列,values返回的是一個字典序列
-distinct() 剔除重複
10 單表基於雙下劃線模糊查詢
Book.objects.filter(price__in=[100,200,300])
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)
Book.objects.filter(price__range=[100,200])
Book.objects.filter(title__contains="python")---->%python%
Book.objects.filter(title__endswith="py")----->%py
Book.objects.filter(title__startswith="py")---->py%
Book.objects.filter(title__icontains="python")--->忽略大小寫
Book.objects.filter(pub_date__year=2012,pub_date__month=12)
二 建立多表模型(詳情見代碼) (約束,外鍵管理--->不寫髒數據)
#用了OneToOneField和ForeignKey,模型表的字段,後面會自定加_id
# ManyToManyField會自動建立第三張表
# *************重點
# 一對一的關係:OneToOneField
# 一對多的關係:ForeignKey
ForeignKey(to=Publish, to_field='id',on_delete=models.CASCADE)
級聯刪除:CASCADE
設置爲空:SET_NULL
什麼都不作:DO_NOTHING
# 多對多的關係:ManyToManyField
三 添加表記錄
1 一對多新增
-兩種方式:
-publish=對象
-publish_id=id
2 一對多刪除:同單表刪除
3 一對多修改:兩種方式,能夠傳對象,能夠傳id
4 一對一跟一對多同樣
5 多對多:
-add ----->能夠傳對象,能夠傳id,能夠傳多個
-remove ----->能夠傳對象,能夠傳id,能夠傳多個
-clear ---->沒有參數
-set ----->先清空,再添加,傳參,只能傳列表,列表裏面能夠是對象,能夠是id
四 基於對象的跨表查詢
1 一對一
正向:正向查詢按字段
反向:反向查詢按表名小寫
2 一對多
正向:正向查詢按字段
反向:反向按表名小寫_set.all()
3 多對多
正向:正向查詢按字段
反向查詢:反向按表名小寫_set.all()
4******基於對象的查詢,就是屢次查詢(子查詢)
正向---->關聯字段在那個表,從那個表往外查
反向---->關聯字段不在那個表,從那個表往外查
正向 查詢紅樓夢這本書的出版社郵箱
# book=Book.objects.filter(name='紅樓夢').first()
# pulish=book.publish 就是出版社對象
# print(pulish.email)
反向 查詢地址是北京 的出版社出版的圖書
# publish=Publish.objects.filter(addr='北京').first()
# books=publish.book_set.all() 拿出全部的圖書
統計一下條數
# books=publish.book_set.all().count()
# print(books)
五 基於雙下劃線的跨表查詢 1 連表查詢 2 一對一雙下劃線查詢 1 正向:按字段,跨表能夠在filter,也能夠在values中 2 反向:按表名小寫,跨表能夠在filter,也能夠在values中 查詢lqz的手機號 Author.objects.filter(name='lqz').values('authordetail__phone') AuthorDetail.object.filter(author__name='lqz').values('phone')5 聚合查詢 3 聚合函數 from django.db.models import Avg,Count,Max,Min,Sum #(平均,統計數量,最大,最小,求和) # 計算全部圖書的平均價格 # ret=Book.objects.all().aggregate(Avg('price')) # print(ret) 4 分組查詢 終極總結: values在前,表示group by,在後,表示取值 filter在前,表示過濾(where),在後,表示having(對分組以後的結果再進行過濾) 六 補充 1 F查詢與Q查詢 F爲了字段=後面的值,不能放字段,因此用F函數包裹一下就能夠了 Q爲了構造與&,或|,非~的關係 2 經常使用字段:必須記住,很是用字段,瞭解便可 3 orm字段參數: null 能夠爲空 unique 惟一性約束 default 默認值 db_index 爲該字段建索引 只給日期類型和時間類型用 auto_now_add 新增數據時,默認把當前時間存入 auto_now 修改的時候,默認把當前時間存入 4 關係字段 ForeignKey -to 關聯哪一個表 -to_field 關聯的字段 -related_name 反向操做時,使用的字段名,用於代替原反向查詢時的'表名_set'。(通常不要用) -related_query_name :基於雙下劃線的反向查詢以前按表名小寫(通常不要用) -on_delete:models.CASCADE,models.SET_NULL -db_constraint:db_constraint=False表明,不作外鍵關聯