多表操作,常用非常用字段
生活随笔
收集整理的這篇文章主要介紹了
多表操作,常用非常用字段
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1基于雙下劃線的跨表查詢
套路一樣,用__跨表
-一對多
-多對多
2 聚合查詢
-聚合函數
from django.db.models import Avg,Count,Max,Min,Sum
# 計算所有圖書的平均價格
# ret=Book.objects.all().aggregate(Avg('price'))
# print(ret)
3分組查詢
終極總結:
values在前,表示group by,在后,表示取值
filter在前,表示過濾(where),在后,表示having(對分組之后的結果再進行過濾)
4 F查詢與Q查詢
-F為了字段=后面的值,不能放字段,所以用F函數包裹一下就可以了
-Q為了構造與&,或|,非~的關系
5 常用字段:必須記住,非常用字段,了解即可
6 orm字段參數:
-null 可以為空
-unique 唯一性約束
-default 默認值
-db_index 為該字段建索引
-只給日期類型和時間類型用
-auto_now_add 新增數據時,默認把當前時間存入
-auto_now 修改的時候,默認把當前時間存入
7 關系字段
ForeignKey
-to 關聯哪個表
-to_field 關聯的字段
-related_name 反向操作時,使用的字段名,用于代替原反向查詢時的'表名_set'。(一般不要用)
-related_query_name :基于雙下劃線的反向查詢之前按表名小寫(一般不要用)
-on_delete:models.CASCADE,models.SET_NULL
-db_constraint:db_constraint=False代表,不做外鍵關聯
代碼;
import osif __name__ == '__main__':os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day77.settings")import djangodjango.setup()from app01.models import *# 基于雙 下劃線的一對多查詢# 查詢出版社為北京出版社出版的所有圖書的名字,價格# ret=Publish.objects.filter(name='北京出版社').values('book__name','book__price')# print(ret)# ret=Book.objects.filter(publish__name='北京出版社').values('name','price')# print(ret)# 查詢北京出版社出版的價格大于19的書# ret=Publish.objects.filter(name='北京出版社',book__price__gt=19).values('book__name','book__price')# print(ret)# 多對多# 查詢紅樓夢的所有作者名字# ret=Book.objects.filter(name='紅樓夢').values('authors__name')# print(ret)# ret=Author.objects.filter(book__name='紅樓夢').values('name')# print(ret)# 查詢圖書價格大于30的所有作者名字# ret=Book.objects.filter(price__gt=30).values('authors__name')# print(ret)# 進階練習--連續跨表# 查詢北京出版社出版過的所有書籍的名字以及作者的姓名# 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)# 手機號以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# 計算所有圖書的平均價格# ret=Book.objects.all().aggregate(Avg('price'))# print(ret)# 計算圖書的最高價格# ret=Book.objects.all().aggregate(Max('price'))# print(ret)#他是queryset的終止子句# 計算圖書的最高價格,最低價格,平均價格,總價# # ret=Book.objects.all().aggregate(Max('price'),Min('price'),Avg('price'),Sum('price'))# print(ret)#分組查詢annotate()# 統計每一本書作者個數# 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)# 統計每一個出版社的最便宜的書(以誰group by 就以誰為基表)# ret=Publish.objects.all().annotate(m=Min('book__price')).values('name','m')# print(ret)# 統計每一本以py開頭的書籍的作者個數# ret1=Book.objects.all().filter(name__startswith='py').annotate(c=Count('authors')).values('name','c')# print(ret1)# 總結: group by 誰,就以誰做基表,filter過濾,annotate取分組,values取值# 總結終極版本# values在前,表示group by 在后,表示取值# filter在前,表示where條件,在后表示having# 統計每一本以py開頭的書籍的作者個數--套用模板# ret2=Book.objects.all().values('name').filter(name__startswith='py').annotate(c=Count('authors')).values('name','c')# print(ret2)# 查詢各個作者出的書的總價格# 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)#查詢名字叫lqz作者書的總價格# ret=Author.objects.all().values('pk').filter(name='lqz').annotate(s=Sum('book__price')).values('name','s')# print(ret)# 查詢所有作者寫的書的總價格大于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)# 總結終極版本# values在前,表示group by 在后,表示取值# filter在前,表示where條件,在后表示having# 統計不止一個作者的圖書 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自增列,必須填入參數 primary_key=True。當model中如果沒有自增列,則自動會創建一個列名為id的列。
IntegerField: 一個整數類型,范圍在 -2147483648 to 2147483647。
CharField: 字符類型,必須提供max_length參數, max_length表示字符長度。
DateField: 日期字段,日期格式? YYYY-MM-DD,相當于Python中的datetime.date()實例。
DateTimeField: 日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當于Python中的datetime.datetime()實例
2、ORM字段參數
null:用于表示某個字段可以為空
unique:如果設置為unique=True 則該字段在此表中必須是唯一的 。
db_index: 如果db_index=True 則代表著為此字段設置索引。
default: 為該字段設置默認值。
DateField 和 DateTimeField
auto_now_add 配置auto_now_add=True,創建數據記錄的時候會把當前時間添加到數據庫。
auto_now 配置上auto_now=True,每次更新數據記錄的時候會更新該字段。
3、關系字段
ForeignKey:外鍵類型在ORM中用來表示外鍵關聯關系,一般把ForeignKey字段設置在 '一對多'中'多'的一方。
ForeignKey可以和其他表做關聯關系同時也可以和自身做關聯關系。
to:設置要關聯的表
to_field: 設置要關聯的表的字段
related_name: 反向操作時,使用的字段名,用于代替原反向查詢時的'表名_set'。
related_query_name: 反向查詢操作時,使用的連接前綴,用于替換表名。
on_delete: 當刪除關聯表中的數據時,當前表與其關聯的行的行為。
to: 設置要關聯的表。
to_field: 設置要關聯的字段。
on_delete: 同ForeignKey字段
ManyToManyField
to: 設置要關聯的表
symmetrical: 僅用于多對多自關聯時,指定內部是否創建反向操作的字段。默認為True。
through:在使用ManyToManyField字段時,Django將自動生成一張表來管理多對多的關聯關系。但我們也可以手動創建第三張表來管理多對多關系,此時就需要通過through來指定第三張表的表名。
through_fields: 設置關聯的字段。
db_table:默認創建第三張表時,數據庫中表的名稱。
元信息:
db_table: ORM在數據庫中的表名默認是?app_類名,可以通過db_table可以重寫表名。
index_together: 聯合索引。
unique_together: 聯合唯一索引。
ordering:指定默認按什么字段排序。只有設置了該屬性,我們查詢到的結果才可以被reverse()。
套路一樣,用__跨表
-一對多
-多對多
2 聚合查詢
-聚合函數
from django.db.models import Avg,Count,Max,Min,Sum
# 計算所有圖書的平均價格
# ret=Book.objects.all().aggregate(Avg('price'))
# print(ret)
3分組查詢
終極總結:
values在前,表示group by,在后,表示取值
filter在前,表示過濾(where),在后,表示having(對分組之后的結果再進行過濾)
4 F查詢與Q查詢
-F為了字段=后面的值,不能放字段,所以用F函數包裹一下就可以了
-Q為了構造與&,或|,非~的關系
5 常用字段:必須記住,非常用字段,了解即可
6 orm字段參數:
-null 可以為空
-unique 唯一性約束
-default 默認值
-db_index 為該字段建索引
-只給日期類型和時間類型用
-auto_now_add 新增數據時,默認把當前時間存入
-auto_now 修改的時候,默認把當前時間存入
7 關系字段
ForeignKey
-to 關聯哪個表
-to_field 關聯的字段
-related_name 反向操作時,使用的字段名,用于代替原反向查詢時的'表名_set'。(一般不要用)
-related_query_name :基于雙下劃線的反向查詢之前按表名小寫(一般不要用)
-on_delete:models.CASCADE,models.SET_NULL
-db_constraint:db_constraint=False代表,不做外鍵關聯
代碼;
import osif __name__ == '__main__':os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day77.settings")import djangodjango.setup()from app01.models import *# 基于雙 下劃線的一對多查詢# 查詢出版社為北京出版社出版的所有圖書的名字,價格# ret=Publish.objects.filter(name='北京出版社').values('book__name','book__price')# print(ret)# ret=Book.objects.filter(publish__name='北京出版社').values('name','price')# print(ret)# 查詢北京出版社出版的價格大于19的書# ret=Publish.objects.filter(name='北京出版社',book__price__gt=19).values('book__name','book__price')# print(ret)# 多對多# 查詢紅樓夢的所有作者名字# ret=Book.objects.filter(name='紅樓夢').values('authors__name')# print(ret)# ret=Author.objects.filter(book__name='紅樓夢').values('name')# print(ret)# 查詢圖書價格大于30的所有作者名字# ret=Book.objects.filter(price__gt=30).values('authors__name')# print(ret)# 進階練習--連續跨表# 查詢北京出版社出版過的所有書籍的名字以及作者的姓名# 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)# 手機號以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# 計算所有圖書的平均價格# ret=Book.objects.all().aggregate(Avg('price'))# print(ret)# 計算圖書的最高價格# ret=Book.objects.all().aggregate(Max('price'))# print(ret)#他是queryset的終止子句# 計算圖書的最高價格,最低價格,平均價格,總價# # ret=Book.objects.all().aggregate(Max('price'),Min('price'),Avg('price'),Sum('price'))# print(ret)#分組查詢annotate()# 統計每一本書作者個數# 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)# 統計每一個出版社的最便宜的書(以誰group by 就以誰為基表)# ret=Publish.objects.all().annotate(m=Min('book__price')).values('name','m')# print(ret)# 統計每一本以py開頭的書籍的作者個數# ret1=Book.objects.all().filter(name__startswith='py').annotate(c=Count('authors')).values('name','c')# print(ret1)# 總結: group by 誰,就以誰做基表,filter過濾,annotate取分組,values取值# 總結終極版本# values在前,表示group by 在后,表示取值# filter在前,表示where條件,在后表示having# 統計每一本以py開頭的書籍的作者個數--套用模板# ret2=Book.objects.all().values('name').filter(name__startswith='py').annotate(c=Count('authors')).values('name','c')# print(ret2)# 查詢各個作者出的書的總價格# 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)#查詢名字叫lqz作者書的總價格# ret=Author.objects.all().values('pk').filter(name='lqz').annotate(s=Sum('book__price')).values('name','s')# print(ret)# 查詢所有作者寫的書的總價格大于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)# 總結終極版本# values在前,表示group by 在后,表示取值# filter在前,表示where條件,在后表示having# 統計不止一個作者的圖書 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自增列,必須填入參數 primary_key=True。當model中如果沒有自增列,則自動會創建一個列名為id的列。
IntegerField: 一個整數類型,范圍在 -2147483648 to 2147483647。
CharField: 字符類型,必須提供max_length參數, max_length表示字符長度。
DateField: 日期字段,日期格式? YYYY-MM-DD,相當于Python中的datetime.date()實例。
DateTimeField: 日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當于Python中的datetime.datetime()實例
2、ORM字段參數
null:用于表示某個字段可以為空
unique:如果設置為unique=True 則該字段在此表中必須是唯一的 。
db_index: 如果db_index=True 則代表著為此字段設置索引。
default: 為該字段設置默認值。
DateField 和 DateTimeField
auto_now_add 配置auto_now_add=True,創建數據記錄的時候會把當前時間添加到數據庫。
auto_now 配置上auto_now=True,每次更新數據記錄的時候會更新該字段。
3、關系字段
ForeignKey:外鍵類型在ORM中用來表示外鍵關聯關系,一般把ForeignKey字段設置在 '一對多'中'多'的一方。
ForeignKey可以和其他表做關聯關系同時也可以和自身做關聯關系。
to:設置要關聯的表
to_field: 設置要關聯的表的字段
related_name: 反向操作時,使用的字段名,用于代替原反向查詢時的'表名_set'。
related_query_name: 反向查詢操作時,使用的連接前綴,用于替換表名。
on_delete: 當刪除關聯表中的數據時,當前表與其關聯的行的行為。
models.CASCADE
刪除關聯數據,與之關聯也刪除
models.DO_NOTHING
刪除關聯數據,引發錯誤IntegrityError
models.PROTECT
刪除關聯數據,引發錯誤ProtectedError
models.SET_NULL
刪除關聯數據,與之關聯的值設置為null(前提FK字段需要設置為可空)
models.SET_DEFAULT
刪除關聯數據,與之關聯的值設置為默認值(前提FK字段需要設置默認值)
models.SET
刪除關聯數據,
a. 與之關聯的值設置為指定值,設置:models.SET(值)
b. 與之關聯的值設置為可執行對象的返回值,設置:models.SET(可執行對象)
to: 設置要關聯的表。
to_field: 設置要關聯的字段。
on_delete: 同ForeignKey字段
ManyToManyField
to: 設置要關聯的表
symmetrical: 僅用于多對多自關聯時,指定內部是否創建反向操作的字段。默認為True。
through:在使用ManyToManyField字段時,Django將自動生成一張表來管理多對多的關聯關系。但我們也可以手動創建第三張表來管理多對多關系,此時就需要通過through來指定第三張表的表名。
through_fields: 設置關聯的字段。
db_table:默認創建第三張表時,數據庫中表的名稱。
元信息:
db_table: ORM在數據庫中的表名默認是?app_類名,可以通過db_table可以重寫表名。
index_together: 聯合索引。
unique_together: 聯合唯一索引。
ordering:指定默認按什么字段排序。只有設置了該屬性,我們查詢到的結果才可以被reverse()。
?
轉載于:https://www.cnblogs.com/zhouhao123/p/9959617.html
總結
以上是生活随笔為你收集整理的多表操作,常用非常用字段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一对一交友源码,一对一视频交友源码,这些
- 下一篇: 可能是基于 Hooks 和 Typesc