今日學習內容總結5.3
阿新 • • 發佈:2022-05-18
今日學習內容總結
雙下劃線查詢
引數介紹
引數 | 意義 |
---|---|
__in | 是否在 |
__gt | 大於 |
__lt | 小於 |
__gtr | 大於等於 |
__lte | 小於等於 |
__range | 在...之間,閉區間 |
__contains | 包含 |
__icontains | 包含(忽略大小寫) |
__startswith | 以...開頭 |
__endswith | 以...結尾 |
__year | 取出年份 |
__month | 取出月份 |
__day | 取出日期 |
__hour | 取出小時 |
__minute | 取出分鐘 |
__second | 取出秒 |
__week_day | 一週的第幾天 |
使用方法
# 查詢年齡大於20的使用者 res = models.User.objects.filter(age__gt=20) # 查詢年齡小於20的使用者 res = models.User.objects.filter(age__lt=20) # 查詢年齡大於等於20的使用者 res = models.User.objects.filter(age__gte=20) # 查詢年齡小於等於20的使用者 res = models.User.objects.filter(age__lte=20) # 查詢年齡是18,22,25的使用者 res = models.User.objects.filter(age__in=[18,22,25]) # 查詢年齡在18到26之間的使用者 res = models.User.objects.filter(age__range=[18,26]) # 查詢姓名中包含字母j的使用者(區分大小寫) res = models.User.objects.filter(name__contains='j') # 查詢姓名中包含字母j的使用者(忽略大小寫) res = models.User.objects.filter(name__icontains='j') # 查詢姓名中以字母j為開頭的使用者(區分大小寫) res = models.User.objects.filter(name__startswith='j') # 查詢姓名中以字母j為開頭的使用者(忽略大小寫) res = models.User.objects.filter(name__istartswith='j') # 查詢姓名中以字母j結尾的使用者 res = models.User.objects.filter(name__endswith='j') # 查詢月份是5月的資料 res = models.User.objects.filter(op_time__month=5) # 查詢年份是22年的資料 res = models.User.objects.filter(op_time__year=2022)
外來鍵欄位的建立
ForeignKey 一對多
django orm外來鍵欄位針對一對多關係也是建在多的一方。
# 設定要關聯的表,自動關聯主鍵 to # 自己設定要關聯的表的欄位 to_field\ti_fields # 基於物件反向操作時,使用的欄位名,用於代替原反向查詢是的'表名小寫_set',不建議使用 related_name # 基於連表反向查詢時使用的連線字首,用於替換表名 related_query_name # 當刪除關聯表中的資料時,當前表與其關聯的行的行為 on_delete # 是否在資料庫中建立外來鍵約束,預設為True。可以設定為False db_constraint
on_delete引數值(1.x版本預設新增該引數, 2.x以後必須加上, 否則報錯)。
# 例:on_delete=models.CASCADE
models.CASCADE
# 刪除關聯資料,與之關聯也刪除
models.DO_NOTHING
# 刪除關聯資料,什麼都不做
models.PROTECT
# 刪除關聯資料,引發錯誤ProtectedError
models.SET_NULL
# 刪除關聯資料,與之關聯的值設定為null(前提FK欄位需要設定為可空)
models.SET_DEFAULT
# 刪除關聯資料,與之關聯的值設定為預設值(前提FK欄位需要設定預設值)
models.SET
# 刪除關聯資料
a. 與之關聯的值設定為指定值,設定:models.SET(值)
b. 與之關聯的值設定為可執行物件的返回值,設定:models.SET(可執行物件)
ManyToManyField 多對多
django orm外來鍵欄位針對多對多關係 可以不用自己建立第三張表。
to
# 設定要關聯的表
to_field
# 設定要關聯的表的欄位
related_query_name
# 反向查詢操作時,使用的連線字首,用於替換表名
symmetrical
# 僅用於多對多自關聯時,指定內部是否建立反向操作的欄位, 預設為True
through
# 手動建立第三張表,指定通過哪個表
through_fields
# 設定關聯的欄位
db_table
# 預設建立第三張表時,資料庫中表的名稱
OneToOneField 一對一
django orm外來鍵欄位針對一對一關係 建在查詢頻率較高的表中
to
# 設定要關聯的表
to_field
# 設定要關聯的表的欄位
on_delete
# 同ForeignKey欄位
外來鍵欄位操作
一對多、一對一外來鍵欄位操作
新增資料
models.Book.objects.create(title='聊齋志異', price=16987.22, publish_id=1) # 直接填寫關聯資料的主鍵值
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title='資本論', price=56777.98, publish=publish_obj)
修改關係欄位
models.Book.objects.filter(pk=1).update(publish_id=3)
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.filter(pk=1).update(publish=publish_obj)
多對多欄位操作
1.第三張關係表建立資料
book_obj = models.Book.objects.filter(pk=1).first()
book_obj.authors.add()
括號內可以放主鍵值也可以放資料物件,並且都支援多個。
2.第三張關係表修改資料
book_obj.authors.set()
括號內必須是一個可迭代物件,元素同樣支援主鍵值或者資料物件。
3.第三張關係表刪除資料
book_obj.authors.remove()
括號內可以放主鍵值也可以放資料物件,並且都支援多個。
4.第三張關係表清空指定資料
book_obj.authors.clear()
括號內無需傳值,直接清空當前表在第三張關係表中的繫結記錄。
多表查詢
正向查詢
1. 正向查詢按欄位
2. 正向:外來鍵欄位在的一方查不在的一方
3. 如果返回結果多個還需要.all()
反向查詢
1. 反向查詢按表名小寫
2. 反向:外來鍵欄位不在的一方查在的一方
3. 如果返回結果多個還需要連線_set.all()
基於物件的跨表查詢
基於物件的跨表查詢本質就是子查詢即分步操作即可。
# 1.查詢資料分析書籍對應的出版社
# 先獲取書籍物件
book_obj = models.Book.objects,filter(title='資料分析').first()
# 再使用跨表查詢
res = book_obj.publish
print(res)
# 2.查詢python全棧開發對應的作者
# 先個獲取書籍物件
book_obj = models.Book.objects.filter(title='python全棧').first()
# 再跨表
res = book_obj.authors.all() # 因為結果 為多個,如果不加all:app01.Author.None
print(res)
# 3.查詢作者jason的詳細資訊
author_obj = models.Author.objects.filter(name='jason').first()
res = authors_obj.author_detail
print(res)
# 4.查詢東方出版社出版的書籍
publish_obj = models.Publish.objects.filter(name='東方出版社').first()
res = publish_obj.book_set_all()
print(res)
# 5.查詢jason編寫的書籍
author_obj = models.Author.objects.filter(name='jason').first()
res = author_obj.book_set.all()
print(res)
# 6.查詢電話是110的作者
author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
res = author_detail_obj.author
print(res)
基於雙下劃線的跨表查詢
基於雙下劃線的跨表查詢本質就是連表操作。
# 1.查詢資料分析書籍對應的出版社名稱以及出版地址
res = models.Book.objects.filter(title='資料分析').values('publish_name', 'publish_addr')
print(res)
# 2.查詢python全棧開發對應的作者姓名和年齡
res = models.Book.objects.filter(title='python全棧開發').values('authors_name', 'authors_age')
print(res)
# 3. 查詢作者jason的手機號和地址
res = models.Author.objects.filter(name='jason').values('author_detail_phone', 'author_datail_addr')
print(res)
# 4.查詢東方出版社出版的書籍名稱和價格
res = models.Publish.objects.filter(name='東方出版社').values('book_title', 'book_price')
print(res)
# 5.查詢jason編寫的書籍名稱和日期
res = models.Author.objects.filter(name='jason').values('book_title', 'book_publish_time')
print(res)
# 6.查詢電話是110的作者的姓名和年齡
res = models.AuthorDetail.objects.filter(phone=110).values('author_name', 'author_age')
雙下線查詢擴充套件
基於雙下劃線的跨表查詢的結果也可以是完整的資料物件。
手上有條件所在的表可以不被models點,直接點最終的目標資料對應的表。
# 1.查詢資料分析書籍對應的出版社名稱
res = models.Publish.objects.filter(book__title='資料分析').values('name')
print(res)
# 2.查詢python全棧開發對應的作者姓名和年齡
res = models.Author.objects.filter(book_title='python全棧開發').values('name', 'age')
# 3.查詢作者jason的手機號和地址
res = models.AuthorDetail.objects.filter(author_name='jason').values('phone', 'addr')
# 4.查詢東方出版社出版的書籍名稱和價格
res = models.Book.objects.filter(publish_name='東方出版社').values('title', 'price')
# 5.查詢jason編寫的書籍名稱和日期
res = models.Book.objects.filter(author_name='jason').values('title', 'publish_time')
# 6.查詢電話是110的作者的姓名和年齡
res = models.Author.objects.filter(author_detail_phone=110).values('name', 'age')
# 連續跨表操作
# 查詢python全棧開發對應的作者的手機號
res = models.Book.objects.filter(title='python全棧開發').values('authors_author_detail_phone')
如何檢視SQL語句
1. 如果結果集物件是queryset 那麼可以直接點query檢視
2. 配置檔案固定配置
適用面更廣 只要執行了orm操作 都會列印內部SQL語句