Django微講解(六)
阿新 • • 發佈:2022-05-17
Django微講解(六)
雙下劃線查詢
# 1.查詢年齡大於50的使用者 res = models.Users.objects.filter(age__gt=50) ''' __gt:大於 __lt:小於 __gte:大於等於 __lte:小於等於 ''' # 2.查詢年齡是18,28,38的使用者 res = models.Users.objects.filter(age__in=[18,28,38]) # 3.查詢年齡18到40之間的使用者 res = models.Users.objects.filter(age__range=[18,50]) # 4.查詢使用者名稱中包含字母o的使用者 res = models.Users.objects.filter(name__contains='o') # 區分大小寫 res = models.Users.objects.filter(name__icontains='o') # 不區分大小寫 # 5.查詢月份是5月份的資料 res = models.Users.objects.filter(op_time__month=5) # 6.查詢年份是22年的資料 res = models.Users.objects.filter(op_time__year=2022)
外來鍵欄位的建立
我們在講資料庫外來鍵欄位的時候,先講了表與表之間的關係種類,一共有三種,分別是一對一、一對多、多對多的關係,然後我們 就可以根據這些關係來建立外來鍵欄位,一對多的關係我們就把外來鍵欄位建立在多得一方,多對多的關係我們就把外來鍵建立在第三張關係表上, 一對一的關係外來鍵可以建立在任意一張表上,推薦建立在使用頻率較高的表上。 我們在models.py檔案建立四張表,分別是圖書表、出版社表、作者表和作者詳情表,我們就以這四張表為例子來建立表關係。 1.書與出版社是一對多關係,書是多,出版社是一,Django ORM外來鍵欄位針對一對多關係也是建在多的一方,關鍵字是'ForeignKey' 示例:publish = models.ForeignKey(to='Publish') # 預設關聯的就是主鍵欄位 2.作者與作者詳情是一對一關係,,Django ORM針對一對一關係建議外來鍵欄位建立在查詢頻率較高的表中,關鍵字是'OneToOneField' 示例:author_detail = models.OneToOneField(to='AuthorDetail') 3.書與作者是多對多的關係,Django ORM針對多對多關係,可以不要建立第三張關係表,關鍵字是'ManyToManyField' 示例:authors = models.ManyToManyField(to='Author') # 自動建立書和作者的第三張關係表 # 關鍵字 1.ManyToManyField:不會在表中建立實際的欄位,而是告訴Django ORM自動建立第三張表 2.ForeignKey、OneToOneField:會在欄位的後面新增_id字尾,如果你再定義模型類的時候自己添加了該字尾,那麼在執行遷移命 令的時候還會再次追加_id,所以建議不要自己加 # 關鍵字的引數 to:用於指定跟哪張表有關係,自動關聯主鍵 to_field:指定關聯欄位 to_fields:指定關聯多個欄位
外來鍵欄位操作
# 一對一、一對多外來鍵欄位操作 1.新增資料 方式一: models.Book.objects.create(title='cc',price=55555,publish_id=1) 方式二: obj = models.Publish.objects.filter(pk=1).first() models.Book.objects.create(title='zzz',price=5554.23,publish=obj) 2.修改資料 方式一: models.Book.objects.filter(pk=1).update(title='qqq') 方式二: obj = models.Publish.objects.filter(pk=2).first() models.Book.objects.filter(pk=1).update(publish_id=obj) # 多對多欄位操作 1.第三張關係表建立資料 obj = models.Book.objects.filter(pk=2).first() obj.authors.add(1 ) # 括號內支援傳入多個引數,用逗號隔開即可,也可以放資料物件 2.第三張關係表修改資料 obj = models.Book.objects.filter(pk=2).first() obj.authors.set([2,]) # 括號內的引數必須是一個可迭代物件,裡面的元素同樣支援資料物件 3.第三張關係表刪除資料 obj = models.Book.objects.filter(pk=2).first() obj.authors.remove(2) # 括號內的引數支援資料物件,同樣支援多個 4.第三張關係表清空指定資料 obj = models.Book.objects.filter(pk=1).first() obj.authors.clear() # 括號內無需傳值,直接清空當前表在第三張關係表中的繫結記錄
多表查詢
我們在講述資料庫的多表查詢的時候,講了兩種方法,分別是子查詢和連表查詢,Django ORM本質上使用的還是上述兩種方式,只
不過資料庫的子查詢是將SQL語句用括號括起來當做條件使用,Django ORM中是基於物件的跨表查詢,資料庫的連表查詢是使用一些關鍵字把
所需要使用的表連成一張表然後操作,Django ORM連表操作是基於雙下劃線的跨表查詢
# 正反向的概念
核心在於當前資料物件是否含有外來鍵欄位,有的話就是正向,沒有就是反向
這個正反向查詢是有一個口訣的,'正向查詢按外來鍵欄位名,反向查詢按表名小寫'
基於物件的跨邊查詢
# 1.查詢C++書籍對應的出版社
obj = models.Book.objects.filter(title='C++').first()
res = obj.publish
print(res)
# 2.查詢C++對應的作者
obj = models.Book.objects.filter(title='C++').first()
res = obj.authors.all()
print(res)
# 3.查詢作者oscar的詳情資訊
obj = models.Author.objects.filter(name='oscar').first()
res = obj.author_detail
print(res)
# 4.查詢aachubanshe出版的書籍
obj = models.Publish.objects.filter(name='aachubanshe').first()
res = obj.book_set.all()
print(res)
# 5.查詢oscar編寫的書籍
obj = models.Author.objects.filter(name='oscar').first()
res = obj.book_set.all()
print(res)
# 6.查詢電話是111的作者
obj = models.AuthorDetail.objects.filter(phone=111).first()
res = obj.author
print(res)
基於雙下劃線的跨表查詢
# 1.查詢C++對應的出版社名稱
res = models.Book.objects.filter(title='C++').values('publish__name')
# 2.查詢C++對應的作者姓名
res = models.Book.objects.filter(title='C++').values('authors__name')
# 3.查詢作者oscar的手機號和地址
res = models.Author.objects.filter(name='oscar').values('author_detail__phone','author_detail__addr')
# 4.查詢aachubanshe出版的書籍名稱和價格
res = models.Publish.objects.filter(name='aachubanshe').values('book__title','book__price')
# 5.查詢oscar編寫的書籍名稱和日期
res = models.Author.objects.filter(name='oscar').values('book__title','book__publish_time')
# 6.查詢電話是111的作者的姓名
res = models.AuthorDetail.objects.filter(phone=111).values('author__name')
雙下劃線查詢擴充套件
基於雙下劃線的跨表查詢的結果也可以是完整的資料物件,我們不點手中有條件的表,直接點最終的目標資料對應的表
# 1.查詢C++對應的出版社名稱
res = models.Publish.objects.filter(book__title='C++')
# 2.查詢C++對應的作者姓名
res = models.Author.objects.filter(book__title='C++').values('name')
# 3.查詢作者oscar的手機號和地址
res = models.AuthorDetail.objects.filter(author__name='oscar').values('phone','addr')
# 4.查詢aachubanshe出版的書籍名稱和價格
res = models.Book.objects.filter(publish__name='aachubanshe').values('title','price')
# 5.查詢oscar編寫的書籍名稱和日期
res = models.Book.objects.filter(authors__name='oscar').values('title','publish_time')
# 6.查詢地址是sh的作者的姓名
res = models.Author.objects.filter(author_detail__addr='sh').values('name')
# 7.連續跨表操作,查詢C++對應的作者地址
res = models.Book.objects.filter(title='C++').values('authors__author_detail__addr')
如何檢視SQL語句
# 方式一
如果結果集物件是queryset,那麼可以直接點query檢視
# 方式二
配置檔案固定配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
把上述程式碼放到settings資料夾,然後只要執行了ORM操作就會列印內部SQL語句
這裡是IT小白陸祿緋,歡迎各位大佬的指點!!!