Django基礎模型層(77-78)

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表明,不作外鍵關聯  
相關文章
相關標籤/搜索