1. 程式人生 > 其它 >Django微講解(六)

Django微講解(六)

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小白陸祿緋,歡迎各位大佬的指點!!!