Django外來鍵欄位的增刪改查&跨表查詢
阿新 • • 發佈:2022-03-03
內容概要
- 外來鍵欄位的增刪改查
- 正反向查詢的概念
- 基於物件的跨表查詢
- 基於雙下劃線的跨表查詢(連表操作)
- F與Q查詢
內容詳細
外來鍵欄位的增刪改查
# 前期資料表準備 # 以圖書 出版社 作者 作者詳情表為例 # 1. 針對一對多,一對一 # 增加資料,增加一本書 # models.Book.objects.create(title='西遊記', price=100, publish_time='2022-02-01', publish_id=1) # 先查詢出你要新增的出版社物件 # publish_obj = models.Publish.objects.filter(pk=2).first() # models.Book.objects.create(title='西遊記1', price=100, publish_time='2022-02-01', publish=publish_obj) # 第二種方式 # book_obj = models.Publish.objects.filter(pk=2).first() # book_obj.publish.add(1) # 2. 改 # models.Book.objects.filter(pk=1).update(publish_id=2) # book_obj = models.Book.objects.filter(pk=1).first() # print(book_obj.publish) # # publish_obj = models.Publish.objects.filter(pk=1).first() # models.Book.objects.filter(pk=1).update(publish=publish_obj) # 針對多對多 # 給一本書新增多個作者 # book_obj = models.Book.objects.filter(pk=1).first() # print(book_obj.authors) # app01.Author.None # print(book_obj.authors.all()) # app01.Author.None # 增加 # book_obj.authors # 代表已經到第三張表了 # book_obj.authors.add(1) # 支援物件 # author_obj1 = models.Author.objects.filter(pk=1).first() # author_obj2 = models.Author.objects.filter(pk=2).first() # book_obj.authors.add(1, 2) # book_obj.authors.add(author_obj1, author_obj2) # 改 # book_obj.authors.set([3, 2]) # book_obj.authors.set([author_obj1, author_obj2]) # 刪除 # book_obj.authors.remove(2) # 清空 # book_obj.authors.clear()
正反向查詢
正向查詢 反向查詢 ''' 外來鍵欄位在我手上,我查你就是正向 外來鍵欄位不再我手上,我查你就是反向 ''' eg: book >>> publish # 正向 publish >>> book # 反向 author >>> book # 反向 book >>> author # 正向 在多表查詢的時候,按照正反向查詢口訣 ''' 1. 正向查詢按照欄位(外來鍵欄位) 2. 反向查詢按照表名小寫或者表名小寫_set.all() '''
基於物件的跨表查詢
###############################跨表查詢########################################### # 1. # 查詢書籍主鍵為1的出版社 # 書 >>> 出版社 >>> 正向 # book_obj = models.Book.objects.filter(pk=1).first() # print(book_obj) # print(book_obj.publish) # 代表的是出版社物件 # print(book_obj.publish.name) # print(book_obj.publish.addr) # 2. # 查詢書籍主鍵位1的作者 # book >>> author >>> 正向 # book_obj = models.Book.objects.filter(pk=1).first() # print(book_obj.authors) # app01.Author.None # print(book_obj.authors.all()) # app01.Author.None # for author_obj in book_obj.authors.all(): # print(author_obj.name) # 3. # 查詢tom的手機號 # 作者 >>> 作者詳情 >>> 正向 # author_obj = models.Author.objects.filter(name='tom').first() # print(author_obj.author_detail) # print(author_obj.author_detail.phone) # 4. # 查詢東京出版社出版的書籍 # 出版社查書 >>> 反向 # publish_obj = models.Publish.objects.filter(name='東京出版社').first() # print(publish_obj.book_set) # app01.Book.None # print(publish_obj.book_set.all()) # app01.Book.None # for book_obj in publish_obj.book_set.all(): # print(book_obj.title) # 5. # 查詢tom寫過的書 # 作者查書 >>> 反向 author_obj = models.Author.objects.filter(name='tom').first() print(author_obj.book_set.all()) # 6. # 查詢手機號是120的作者姓名 # 作者詳情查作者資訊 >>> 反向 author_detail_obj = models.AuthorDetail.objects.filter(phone=120).first() print(author_detail_obj.author) # ''' 總結: 反向查詢只要查詢出的結果可能有多個的時候,都要加上 表名_set.all() 如果查詢出來的結果是一個,就不用加_set,直接使用表名小寫 '''
基於雙下劃線的跨表查詢
# 1.
# 查詢書籍主鍵為1的出版社名稱和書籍名稱
'''
正反向查詢的概念同樣適用
'''
# res = models.Book.objects.filter(pk=1).values('title', 'publish__name')
# print(res)
# 2.
# 查詢書籍主鍵位1的作者名稱
# res = models.Book.objects.filter(pk=1).values('authors__name')
# print(res)
# 3.
# 查詢tom的手機號
# res = models.Author.objects.filter(name='tom').values('author_detail__phone')
# print(res)
# 4.
# 查詢東京出版社出版的書籍
# res = models.Publish.objects.filter(name='東京出版社').values('book__title')
# print(res)
# 5.
# 查詢tom寫過的書
# res = models.Author.objects.filter(name='tom').values('book__title')
# print(res)
# 6.
# 查詢手機號是120的作者姓名
# res = models.AuthorDetail.objects.filter(phone=120).values('author__name')
# print(res)
# 7.
# 查詢書籍主鍵位1的作者的手機號
# book author author_detail
res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
print(res)
F查詢與Q查詢
# F查詢
可以拿到資料庫中原有的資料
# 1. 把書籍的價格在原來的基礎之上加100元
book
update book set price = price + 100 where id=1;
# F查詢
# 1. 把書籍的價格在原來的基礎之上加100元
'''
一般來說,跟資料相關的模組要麼在django.db,要麼在django.db.models
'''
from django.db.models import F
''' F查詢預設是對數字型別的'''
# models.Book.objects.update(price=F('price')+100)
from django.db.models.functions import Concat
from django.db.models import Value
# 2.
# models.Book.objects.update(title=Concat(F('title'), Value('東京出版社')))
# Q查詢
# 1. 查詢書籍價格大於等於300的或者id=1的資料
# sql: select * from t where price >= 300 or id=1
# orm:
from django.db.models import Q
# res=models.Book.objects.filter(Q(price__gte=300), Q(id=1)) # 逗號分隔,還是and關係
# res=models.Book.objects.filter(Q(price__gte=300)| Q(id=1)) # |分隔,還是or關係
# res=models.Book.objects.filter(~Q(price__gte=300)| ~Q(id=1)) # ~分隔,取反
# print(res)
# q = 'price'