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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多表操作,常用非常用字段

發(fā)布時(shí)間:2025/6/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多表操作,常用非常用字段 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1基于雙下劃線的跨表查詢
  套路一樣,用__跨表
  -一對(duì)多
  -多對(duì)多
2 聚合查詢
  -聚合函數(shù)
    from django.db.models import Avg,Count,Max,Min,Sum
    # 計(jì)算所有圖書的平均價(jià)格
    # ret=Book.objects.all().aggregate(Avg('price'))
    # print(ret)
3分組查詢
  終極總結(jié):
    values在前,表示group by,在后,表示取值
    filter在前,表示過濾(where),在后,表示having(對(duì)分組之后的結(jié)果再進(jìn)行過濾)
4 F查詢與Q查詢
   -F為了字段=后面的值,不能放字段,所以用F函數(shù)包裹一下就可以了
   -Q為了構(gòu)造與&,或|,非~的關(guān)系
5 常用字段:必須記住,非常用字段,了解即可
6 orm字段參數(shù):
   -null 可以為空
   -unique 唯一性約束
   -default 默認(rèn)值
   -db_index 為該字段建索引
   -只給日期類型和時(shí)間類型用
     -auto_now_add 新增數(shù)據(jù)時(shí),默認(rèn)把當(dāng)前時(shí)間存入
     -auto_now 修改的時(shí)候,默認(rèn)把當(dāng)前時(shí)間存入
7 關(guān)系字段
    ForeignKey
      -to 關(guān)聯(lián)哪個(gè)表
      -to_field 關(guān)聯(lián)的字段
      -related_name 反向操作時(shí),使用的字段名,用于代替原反向查詢時(shí)的'表名_set'。(一般不要用)
    -related_query_name :基于雙下劃線的反向查詢之前按表名小寫(一般不要用)
      -on_delete:models.CASCADE,models.SET_NULL
      -db_constraint:db_constraint=False代表,不做外鍵關(guān)聯(lián)

代碼;
import osif __name__ == '__main__':os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day77.settings")import djangodjango.setup()from app01.models import *# 基于雙 下劃線的一對(duì)多查詢# 查詢出版社為北京出版社出版的所有圖書的名字,價(jià)格# ret=Publish.objects.filter(name='北京出版社').values('book__name','book__price')# print(ret)# ret=Book.objects.filter(publish__name='北京出版社').values('name','price')# print(ret)# 查詢北京出版社出版的價(jià)格大于19的書# ret=Publish.objects.filter(name='北京出版社',book__price__gt=19).values('book__name','book__price')# print(ret)# 多對(duì)多# 查詢紅樓夢(mèng)的所有作者名字# ret=Book.objects.filter(name='紅樓夢(mèng)').values('authors__name')# print(ret)# ret=Author.objects.filter(book__name='紅樓夢(mèng)').values('name')# print(ret)# 查詢圖書價(jià)格大于30的所有作者名字# ret=Book.objects.filter(price__gt=30).values('authors__name')# print(ret)# 進(jìn)階練習(xí)--連續(xù)跨表# 查詢北京出版社出版過的所有書籍的名字以及作者的姓名# ret=Publish.objects.filter(name='北京出版社').values('book__name','book__authors__name')# print(ret)# ret=Book.objects.filter(publish__name='北京出版社').values('name','authors__name')# print(ret)# 手機(jī)號(hào)以151開頭的作者出版過的所有書籍名稱以及出版社名稱# ret=AuthorDetail.objects.filter(phone__startswith='13').values('author__book__name','author__book__publish__name')# print(ret)# ret=Book.objects.filter(authors__authordetail__phone__startswith='13').values('name','publish__name')# # print(ret)# 聚合查詢aggregatefrom django.db.models import Avg,Count,Max,Min,Sum# 計(jì)算所有圖書的平均價(jià)格# ret=Book.objects.all().aggregate(Avg('price'))# print(ret)# 計(jì)算圖書的最高價(jià)格# ret=Book.objects.all().aggregate(Max('price'))# print(ret)#他是queryset的終止子句# 計(jì)算圖書的最高價(jià)格,最低價(jià)格,平均價(jià)格,總價(jià)# # ret=Book.objects.all().aggregate(Max('price'),Min('price'),Avg('price'),Sum('price'))# print(ret)#分組查詢annotate()# 統(tǒng)計(jì)每一本書作者個(gè)數(shù)# ret=Book.objects.all().annotate(c=Count('authors'))# print(ret)# for r in ret:# print(r.name,'---->',r.c)# ret=Book.objects.all().annotate(c=Count('authors')).values('name','c')# print(ret)# 統(tǒng)計(jì)每一個(gè)出版社的最便宜的書(以誰group by 就以誰為基表)# ret=Publish.objects.all().annotate(m=Min('book__price')).values('name','m')# print(ret)# 統(tǒng)計(jì)每一本以py開頭的書籍的作者個(gè)數(shù)# ret1=Book.objects.all().filter(name__startswith='py').annotate(c=Count('authors')).values('name','c')# print(ret1)# 總結(jié): group by 誰,就以誰做基表,filter過濾,annotate取分組,values取值# 總結(jié)終極版本# values在前,表示group by 在后,表示取值# filter在前,表示where條件,在后表示having# 統(tǒng)計(jì)每一本以py開頭的書籍的作者個(gè)數(shù)--套用模板# ret2=Book.objects.all().values('name').filter(name__startswith='py').annotate(c=Count('authors')).values('name','c')# print(ret2)# 查詢各個(gè)作者出的書的總價(jià)格# ret=Author.objects.all().values('name').annotate(s=Sum('book__price')).values('name','s')# ret=Author.objects.all().annotate(s=Sum('book__price')).values('name','s')# print(ret)#查詢名字叫l(wèi)qz作者書的總價(jià)格# ret=Author.objects.all().values('pk').filter(name='lqz').annotate(s=Sum('book__price')).values('name','s')# print(ret)# 查詢所有作者寫的書的總價(jià)格大于30# ret=Author.objects.all().values('pk').annotate(s=Sum('book__price')).filter(s__gt=2).values('name','s')# ret=Author.objects.all().annotate(s=Sum('book__price')).filter(s__gt=30).values('name','s')# print(ret)# 總結(jié)終極版本# values在前,表示group by 在后,表示取值# filter在前,表示where條件,在后表示having# 統(tǒng)計(jì)不止一個(gè)作者的圖書 ret=Book.objects.all().values('pk').annotate(c=Count('authors')).filter(c__gt=1).values('name','c')# ret = Book.objects.annotate(author_num=Count("authors")).filter(author_num__gt=1).values('name','author_num')print(ret) 1、ORM字段
AutoField: int自增列,必須填入?yún)?shù) primary_key=True。當(dāng)model中如果沒有自增列,則自動(dòng)會(huì)創(chuàng)建一個(gè)列名為id的列。
IntegerField: 一個(gè)整數(shù)類型,范圍在 -2147483648 to 2147483647。
CharField: 字符類型,必須提供max_length參數(shù), max_length表示字符長度。
DateField: 日期字段,日期格式? YYYY-MM-DD,相當(dāng)于Python中的datetime.date()實(shí)例。
DateTimeField: 日期時(shí)間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當(dāng)于Python中的datetime.datetime()實(shí)例
2、ORM字段參數(shù)
null:用于表示某個(gè)字段可以為空
unique:如果設(shè)置為unique=True 則該字段在此表中必須是唯一的 。
db_index: 如果db_index=True 則代表著為此字段設(shè)置索引。
default: 為該字段設(shè)置默認(rèn)值。


DateField 和 DateTimeField
auto_now_add  配置auto_now_add=True,創(chuàng)建數(shù)據(jù)記錄的時(shí)候會(huì)把當(dāng)前時(shí)間添加到數(shù)據(jù)庫。
auto_now   配置上auto_now=True,每次更新數(shù)據(jù)記錄的時(shí)候會(huì)更新該字段。

3、關(guān)系字段
ForeignKey:外鍵類型在ORM中用來表示外鍵關(guān)聯(lián)關(guān)系,一般把ForeignKey字段設(shè)置在 '一對(duì)多'中'多'的一方。
ForeignKey可以和其他表做關(guān)聯(lián)關(guān)系同時(shí)也可以和自身做關(guān)聯(lián)關(guān)系。
to:設(shè)置要關(guān)聯(lián)的表
to_field: 設(shè)置要關(guān)聯(lián)的表的字段
related_name: 反向操作時(shí),使用的字段名,用于代替原反向查詢時(shí)的'表名_set'。
related_query_name: 反向查詢操作時(shí),使用的連接前綴,用于替換表名。
on_delete: 當(dāng)刪除關(guān)聯(lián)表中的數(shù)據(jù)時(shí),當(dāng)前表與其關(guān)聯(lián)的行的行為。

models.CASCADE
  刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)也刪除


  models.DO_NOTHING
  刪除關(guān)聯(lián)數(shù)據(jù),引發(fā)錯(cuò)誤IntegrityError


  models.PROTECT
  刪除關(guān)聯(lián)數(shù)據(jù),引發(fā)錯(cuò)誤ProtectedError


  models.SET_NULL
  刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)的值設(shè)置為null(前提FK字段需要設(shè)置為可空)


  models.SET_DEFAULT
  刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)的值設(shè)置為默認(rèn)值(前提FK字段需要設(shè)置默認(rèn)值)


  models.SET

  刪除關(guān)聯(lián)數(shù)據(jù),
  a. 與之關(guān)聯(lián)的值設(shè)置為指定值,設(shè)置:models.SET(值)
  b. 與之關(guān)聯(lián)的值設(shè)置為可執(zhí)行對(duì)象的返回值,設(shè)置:models.SET(可執(zhí)行對(duì)象)

OneToOneField
to: 設(shè)置要關(guān)聯(lián)的表。
to_field: 設(shè)置要關(guān)聯(lián)的字段。
on_delete: 同F(xiàn)oreignKey字段

ManyToManyField
to: 設(shè)置要關(guān)聯(lián)的表
symmetrical: 僅用于多對(duì)多自關(guān)聯(lián)時(shí),指定內(nèi)部是否創(chuàng)建反向操作的字段。默認(rèn)為True。
through:在使用ManyToManyField字段時(shí),Django將自動(dòng)生成一張表來管理多對(duì)多的關(guān)聯(lián)關(guān)系。但我們也可以手動(dòng)創(chuàng)建第三張表來管理多對(duì)多關(guān)系,此時(shí)就需要通過through來指定第三張表的表名。
through_fields: 設(shè)置關(guān)聯(lián)的字段。
db_table:默認(rèn)創(chuàng)建第三張表時(shí),數(shù)據(jù)庫中表的名稱。

元信息:
db_table: ORM在數(shù)據(jù)庫中的表名默認(rèn)是?app_類名,可以通過db_table可以重寫表名。
index_together: 聯(lián)合索引。
unique_together: 聯(lián)合唯一索引。
ordering:指定默認(rèn)按什么字段排序。只有設(shè)置了該屬性,我們查詢到的結(jié)果才可以被reverse()。


?

轉(zhuǎn)載于:https://www.cnblogs.com/zhouhao123/p/9959617.html

總結(jié)

以上是生活随笔為你收集整理的多表操作,常用非常用字段的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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