重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
1.本機電腦下載好mysql數(shù)據(jù)庫
2.打開django,修改setting.py中的DATABASES配置項
創(chuàng)新互聯(lián)公司不能給您低的價格,只能給您高的品質(zhì)!我們努力堅持得到越來越多的客戶認可和追隨,這正是我們繼續(xù)前進的大動力!創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設公司,為企業(yè)提供高端網(wǎng)站建設,營銷型網(wǎng)站制作,外貿(mào)網(wǎng)站制作,做網(wǎng)站,網(wǎng)站改版等做網(wǎng)站服務,建網(wǎng)站費用1680元起,成都數(shù)百家企業(yè)建站公司的選擇。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'python',
'USER': 'root',
'PASSWORD': 'zy',
'HOST': '127.0.0.1',
'POST': '3306',
}
}
3.在pycharm的右側(cè)欄點擊database或者做下角點擊database,連接數(shù)據(jù)庫,如果都沒有,則去pluging里面尋找是否裝了database插件??!
或者
4.輸入需要連接的數(shù)據(jù)庫
5.這里沒有下載驅(qū)動的需要先下載,不然連接不上
6.在django項目中的__init__.py中導入pymysql,告訴django使用pymysql連接數(shù)據(jù)庫,而不是mysqldb模塊
import pymysql
pymysql.install_as_MySQLdb()
7.簡單使用pycharm操作數(shù)據(jù)庫
對象關系映射(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向?qū)ο笈c關系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術。ORM在業(yè)務邏輯層和數(shù)據(jù)庫層之間充當了橋梁的作用
簡單來說,ORM就是使用面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫!
(1)ORM的優(yōu)勢:
1.將表和類一一對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表中的每個字段。
2.ORM提供了對數(shù)據(jù)庫的映射,不用直接編寫SQL代碼,只需操作對象就能對數(shù)據(jù)庫操作數(shù)據(jù),提高了工作效率
(2)ORM的劣勢
1.一些查詢操作完成不了
2.一定程度上犧牲了程序的執(zhí)行效率
3.用久了會忘SQL語言
from django.db import models # 1.導入models模塊
# 2.定義一個類繼承models.Model類(創(chuàng)建一張項目名(應用名)_類名的表)
class Book(models.Model):
# 3.定義類屬性title和price(對應是創(chuàng)建字段名、字段類型和字段選項)
title = models.CharField('書名', max_length=50, default='')
price = models.DecimalField('價格', max_digits=7, decimal_places=2)
class 模型類名(models.Model):
字段名 = models.字段類型(字段選項)
在類里面不指定主鍵字段,django會幫您自動創(chuàng)建一個id主鍵!
注意:對于數(shù)據(jù)庫的增刪改查之后都要進行數(shù)據(jù)庫遷移
1.執(zhí)行python3 manage.py makemigration---將應用下的model.py文件生成一個中間件文件,并保存在migrations文件中
2.執(zhí)行python3 manage.py migrate ----將每個應用下的migrations目錄中的中間文件同步回數(shù)據(jù)庫
1.增加字段
直接在對應的類里面添加字段、字段類型和字段選項
注意增加的字段都需要指定default = '' 或者null = True,如下添加info字段:
info = models.CharField(max_length=32,default='',null=True)
2.修改字段
直接在類里面修改對應字段就行!
然后執(zhí)行數(shù)據(jù)庫遷移命令!
3.字段的刪除
直接在類里面將需要刪的字段注釋掉就行!
然后執(zhí)行數(shù)據(jù)庫遷移命令!
注意:執(zhí)行完畢了,數(shù)據(jù)庫對應的數(shù)據(jù)就沒有了!慎重!??!
每個繼承model.Model的模型類,都有一個objects對象被同樣繼承下來,這個對象叫管理器對象,數(shù)據(jù)庫的增刪改查都是通過模型的管理器實現(xiàn)。
對于數(shù)據(jù)的增刪改查,其實最主要的都是在views.py的視圖函數(shù)里完成的!因此,我們需要在視圖函數(shù)里進行數(shù)據(jù)庫的增刪改查操作!
1.filter()查詢方法
from app01 import models # 1.導入自己創(chuàng)建的模型類
# 2.filter查詢方法,語法是:models.類名.objects.filter(),filter內(nèi)可以查詢多個參數(shù),默認是and連接,等于SQL語法的where方法!,不傳參時代表查所有
res = models.MyModle.objects.filter(username=username)
# 該方法有一個返回值,返回的是一個queryset對象,該對象可以看成是列表套字典的形式,列表里面套著一個個數(shù)據(jù)對象,形式為:[數(shù)據(jù)對象1,數(shù)據(jù)對象2]
# queryset列表也支持索引,切片操作,但是不支持負數(shù)索引,可以當成列表套字典的形式for循環(huán)
user_obj = res[0] # 得到的是具體的數(shù)據(jù)對象,但是官方不推薦使用索引的方式取到具體的數(shù)據(jù)對象,它推薦的是res.first()方法取到列表里的第一個數(shù)據(jù)對象!
print(user_obj.username) # 通過點大法,即.屬性的方法得到具體的值
2.all()查詢所有方法
# all方法查詢User表的所有數(shù)據(jù),返回的是一個queryset對象列表,
user_queryset = models.User.objects.all()
1.create()方法
# create增加數(shù)據(jù)方法,語法是:models.類名.objects.create()
res = models.MyModle.objects.create(username=username,password=password)
# 該方法也有一個返回值,返回的是當前這個數(shù)據(jù)對象
print(res.username,res.password) # 可以通過點屬性的方法,查看到對應屬性的值
2.save()方法
obj = models.User(username=username,password=password)
obj.save() # 保存數(shù)據(jù)到數(shù)據(jù)庫
1.upadte()方法:先查出來,在更新
# 查出id為什么的對象,然后進行批量更新。filter可以查所有,也可以查具體
models.User.objects.filter(id=edit_id).update(username=username,password=password)
2.賦值+save()方法
obj = models.User.objects.filter(id=edit_id).first() #拿到待修改的對象
obj.username = username # 采用給該對象屬性重新賦值的方法修改數(shù)據(jù)
obj.password = password
obj.save() # 最后賦值完記得需咬保存
1.delete()方法:用于批量刪除
# 先filter查出需要刪除的對象,然后.delete()方法
models.User.objects.filter(id=delete_id).delete() # 這里是把filter查出來的queryset對象里全部刪除了,有幾個刪幾個。
# 這里的id可以改寫成pk,用了pk就不需要知道表的主鍵是id還是其他什么了!
2.單一刪除
res = models.User.objects.filter(id=delete_id).first()
res.delete() # 單一刪除
# 1.all() 查詢所有數(shù)據(jù)
# 2.filter() 帶有過濾條件的查詢,拿到的是一個queryset對象列表
# 3.get() 直接拿數(shù)據(jù)對象 但是條件不存在直接報錯
# 4.first() 拿queryset里面第一個元素
# res = models.User.objects.all().first()
# print(res) # 拿到queryset對象列表里的第一個數(shù)據(jù)對象
# 5.last()
# res = models.User.objects.all().last()
# print(res) # 同上,拿到的是最好一個
# 6.values() 可以指定獲取的數(shù)據(jù)字段 select name,age from ...
# res = models.User.objects.values('name','age')
# print(res) # 結(jié)果為:列表套字典
# 7.values_list()
# res = models.User.objects.values_list('name','age')
# print(res) # 結(jié)果為:列表套元祖,
# 8.query
# print(res.query) # 查看內(nèi)部封裝的sql語句
# 上述查看sql語句的方式 只能用于queryset對象
# 只有queryset對象才能夠點擊query查看內(nèi)部的sql語句
# 9.distinct() 去重
# res = models.User.objects.values('name','age').distinct()
# print(res)
"""
去重一定要是一模一樣的數(shù)據(jù)
如果帶有主鍵那么肯定不一樣 你在往后的查詢中一定不要忽略主鍵
"""
# 10.order_by()
# res = models.User.objects.order_by('age') # 默認升序
# res = models.User.objects.order_by('-age') # 降序
# print(res)
# 10.reverse() 反轉(zhuǎn)的前提是 數(shù)據(jù)已經(jīng)排過序了 order_by()
# res = models.User.objects.all()
# res1 = models.User.objects.order_by('age').reverse()
# print(res,res1)
# 11.count() 統(tǒng)計當前數(shù)據(jù)的個數(shù)
# res = models.User.objects.count()
# print(res)
# 12.exclude() 排除在外
# res = models.User.objects.exclude(name='jason')
# print(res)
# 13.exists() #基本用不到因為數(shù)據(jù)本身就自帶布爾值 返回的是布爾值
# res = models.User.objects.filter(pk=10).exists() # 判讀主鍵為10的是否存在,返回是布爾值
# print(res)
__exact:等值查詢
__contains:包含指定值--區(qū)分大小寫 a2=Book.objects.filter(name____contains=‘n’) 查詢出名字里包含n的
__icontains:包含指定值--忽略大小寫
__startwith:以xxx開始
__endwith:以xxx結(jié)尾
__gt:大于指定值,例如:a2=Book.objects.filter(id__gt=3)
__gte:大于等于
__it:小于
__ite:小于等于
__in:查找數(shù)據(jù)是否在指定范圍內(nèi) a2=Book.objects.filter(id__in=[1,3,5])
__range:查詢數(shù)據(jù)是否在指定區(qū)間范圍內(nèi) a2=Book.objects.filter(id__range=[1,5]) 查詢出id在1-5的收尾都要
a2=Book.objects.filter(register_time__month='1'):查詢出月份是1月的數(shù)據(jù)
a2=Book.objects.filter(register_time__year='2022'):查詢出年份在2022的數(shù)據(jù)
表的關系有三種,分別是:一對一、一對多、多對多
判斷表和表之間的關系:換位思考法
具體創(chuàng)建表關系語法:
"""
圖書和出版社:一對多關系,外鍵建在多的一方
圖書和作者:多對多關系,外鍵建在任何一方,但是推薦建在查詢頻率高的一方
作者和作者詳情:一對一關系,外鍵建在任何一方,但是推薦建在查詢頻率高的一方
"""
class Book(models.Model):
title = models.CharField(verbose_name='書名',max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2)
create_time = models.DateTimeField(auto_now_add=True)
# 一對多外鍵建在多的一方,to='是需要建立外鍵的那一個類名publish'
# 注意:在django2、3里面需要指定級聯(lián)刪除參數(shù)on_delete=models.CASCADE
publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
# 多對多外鍵建在查詢頻率高的一方,多對多在sql語句中需要自己手動建第三張表,但是在django中,django遇到會自動幫你創(chuàng)建第三張表!
"""
多對多創(chuàng)建第三張表有三種方式:
1.全自動:無法添加字段,擴展性不高!
author = models.ManyToManyField(to='Author')
2.手動:自己創(chuàng)建第三方表,然后關聯(lián)兩個外鍵,需要寫的代碼多,復雜!!
class Book2Author(models.Model):
book_id = models.ForeignKey(to='Book')
author_id = models.ForeignKey(to='Author')
3.半自動(推薦,擴展性高)
author = models.ManyToManyField(to='Author',through='Book2Author',through_fields=('author','book'))
"""
"""
through_fields字段先后順序
判斷的本質(zhì):
通過第三張表查詢對應的表 需要用到哪個字段就把哪個字段放前面
你也可以簡化判斷
當前表是誰 就把對應的關聯(lián)字段放前面
半自動:可以使用orm的正反向查詢 但是沒法使用add,set,remove,clear這四個方法
"""
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
email = models.EmailField()
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
# 一對一外鍵建在查詢頻率高的一方,需要指定on_delete
author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
class AuthorDetail(models.Model):
phone = models.BigIntegerField()
addr = models.CharField(max_length=64)
from app01 import models
# 1.增
# 法1:直接寫book表里面的外鍵的實際字段名,然后指定關聯(lián)publish的id就行
models.Book.objects.create(title='活著',price=33,publish_id=1)
# 法2:虛擬字段,傳入一個具體的publish的數(shù)據(jù)對象就行
publish_obj = models.Publish.objects.filter(pk=2).first()
# 注意這里需要.first()一下,因為不點拿到的是queryset對象,點一下拿到queryset里的具體數(shù)據(jù)對象
models.Book.objects.create(title='我',price=555,publish=publish_obj)
# 2.刪
models.Publish.objects.filter(pk=2).delete() # 將book里關聯(lián)id=2的也全部刪除
# 3.改
# 法1:update里面?zhèn)骶唧w需要修改的外鍵字段名和值
models.Book.objects.filter(pk=2).update(publish_id=2) # 將id為2的書的關聯(lián)publish_id改成2
# 法2:update里面?zhèn)魅胩摂M字段publish=需要關聯(lián)的publish數(shù)據(jù)對象,同增的法2
# 1.增
# 一本書對應多個作者,先查出這個書的對象,在通過對象.多對多字段名.add()方法關聯(lián)作者id
# add()方法里面可以法數(shù)字1,2,3,表示關聯(lián)作者的主鍵值;還可以放具體的作者數(shù)據(jù)對象?。?book_obj = models.Book.objects.filter(pk=1).first()
book_obj.author.add(1,2)
author_obj = models.Author.objects.filter(pk=1).first()
book_obj.author.add(author_obj)
# 2.刪
# 刪除這邊書關聯(lián)的作者id為1和2的,和add方法一樣也支持里面放具體的作者數(shù)據(jù)對象??!
book_obj.author.remove(1,2)
# 3.改
# set方法修改該書關聯(lián)的作者id為1和3,set方法和add方法一樣也支持里面放具體的作者數(shù)據(jù)對象??!
# 注意:set方法里面必須放一個可迭代對象,比如列表!
book_obj.author.set([1,3])
# 4.清空當前書和作者的對應關系
book_obj.author.clear()
查詢的時候,分正方向查詢,外鍵字段在我手上,我查你就是正向查詢;反之,不在我手上,我查你就是反向查詢。
查詢口訣:正向查詢按字段,反向查詢按表名小寫;
1.基于對象的多表查詢
from app01 import models
# 1.查詢書籍主鍵為1的出版社名稱 ----正向一對多查詢
book_obj = models.Book.objects.filter(pk=1).first() # 先得到主鍵為1的書籍對象
res = book_obj.publish # 正向查詢按字段,Book表里面有一個publish字段,返回一個與主鍵1關聯(lián)的出版社對象
print(res)
print(res.name) # 對象.的方法查詢具體的字段屬性
print(res.addr)
# 2.查詢書籍主鍵為1的作者----正向多對多查詢
book_obj1 = models.Book.objects.filter(pk=1).first()
res = book_obj1.author.all() # 不.all()返回的是一個app01.Author.None
print(res) # .all()返回的是, ]>,書籍id為1對應兩個作者
print(res.first().name) # 通過.first().name 方式獲取作者的具體信息
# 3.查詢作者王的電話 ----正向一對一查詢
author_obj = models.Author.objects.filter(name='王').first()
res = author_obj.author_detail
print(res) # 返回的是AuthorDetail object (1),是一個作者詳情對象
print(res.phone) # .字段查出對應作者的詳情信息
"""
總結(jié):正向查詢時,當你的結(jié)果可能是多個的時候,就需要加.all(),如果是一個直接拿到數(shù)據(jù)對象
"""
# 4.查詢出版社是東風出版社的書----反向一對多查詢
publish_obj = models.Publish.objects.filter(name='東風').first()
res = publish_obj.book_set.all()
print(res)
# 5.查詢作者是王寫過的書----反向多對多查詢
author_obj = models.Author.objects.filter(name='王').first()
res = author_obj.book_set.all()
print(res)
# 6.查詢電話號碼是的作者
author_detail_obj = models.AuthorDetail.objects.filter(phone=).first()
res = author_detail_obj.author
print(res.name)
"""
總結(jié):反向查詢的時候,如果結(jié)果為多個,就需要加_set.all();如果是一對一結(jié)果就一個,就不用!
"""
2.基于雙下劃線__的多表查詢
from app01 import models
# 1.查詢王這個作者的年齡和手機號--正向一對一查詢
# 先得到王這個對象,然后.values,里面放需要查詢的字段名,正向則直接'字段名';反向則'表名小寫__字段名'
res = models.Author.objects.filter(name='王').values('age','author_detail__phone')
print(res) # 得到的是一個queryset對象(列表里套了一個字典)
dict = res.first() # .first()方法取到該字典對象
print(dict['age']) # 字典方式取到具體需要的值
# 反向查詢
res = models.AuthorDetail.objects.filter(author__name='王').values('phone','author__age')
print(res)
# 2.查詢書籍主鍵為1的出版社名字和書的價格---正向一對多查詢
res = models.Book.objects.filter(pk=1).values('price','publish__name')
print(res)
# 反向查詢
res = models.Publish.objects.filter(book__id=1).values('name','book__price')
print(res)
# 3.查詢書籍主鍵為1的作者姓名和書籍名稱
res = models.Book.objects.filter(pk=1).values('title','author__name')
print(res)
# 反向查詢
res = models.Author.objects.filter(book__id=1).values('name','book__title')
print(res)
# 4.終極大招:查詢書籍主鍵為1的作者的電話號碼?。。?--跨了book、author、author_detail三張表查詢
res =models.Book.objects.filter(pk=1).values('author__author_detail__phone')
print(res)
# 反向查詢
res = models.Author.objects.filter(book__id=1).values('author_detail__phone')
print(res)
from django.db import models
# Create your models here.
class MyBook(models.Model):
# 1.字符串字段類型CharField,必須傳的字段選項是max_length=指定最大字符數(shù),verbose_name=''指定該字段在django后臺管理中的描述名
name = models.CharField(max_length=32,verbose_name='姓名')
# 2.數(shù)字字段類型IntegerField
age = models.IntegerField()
# 3.日期時間字段類型DateTimeField
register_time = models.DateTimeField(auto_now_add=True)
# 4.日期字段類型
register_time = models.DateField(auto_now_add=True)
# 針對這兩個字段類型,有兩個關鍵性參數(shù)
# auto_now:每次操作數(shù)據(jù)的時候,該字段會自動將當前時間更新
# auto_now_add:在創(chuàng)建數(shù)據(jù)的時候會自動將當前時間記錄下來,以后只要不認為修改就一直不變
# 5.郵箱字段
email = models.EmailField()
# 6.大數(shù)字字段類型
phone = models.BigIntegerField()
# 7.小數(shù)字段,有兩個字段選項max_digits=8,表示連小數(shù)一共8位;decimal_places=2,表示小數(shù)部分2位。
price = models.DecimalField(max_digits=8,decimal_places=2)
# 8.布爾型字段,傳入?yún)?shù)是False\True,在數(shù)據(jù)庫中對應0\1
boolean = models.BooleanField(False)
# 9.文本字段類型,沒有字數(shù)限制,大文本
text = models.TextField()
# 10.文件字段類型,upload_to=''參數(shù):給該字段傳一個文件對象,會自動將該文件保存在/data目錄下,如何把該文件的路徑傳到數(shù)據(jù)庫中
file = models.FileField(upload_to='/data')
# 11.choices字段參數(shù)
只要某個字段的可能性是可以列舉完全的,那么一般情況下都會采用choices參數(shù)
gender_choices = (
(1,'男'),
(2,'女'),
(3,'其他'), #可以存數(shù)字1,2,也可以存字母等等對應
)
gender = models.IntegerField(choices=gender_choices)
"""
該gender字段存的還是數(shù)字 但是如果存的數(shù)字在上面元祖列舉的范圍之內(nèi)
那么可以非常輕松的通過固定寫法 get_字段名_display()方法獲取到數(shù)字對應的真正的內(nèi)容;
如果不在范圍之內(nèi),存的時候 沒有列舉出來的數(shù)字也能存,取的時候還是取出存的時候的數(shù)字。
print(user_obj.get_gender_display())
"""
# 12 級聯(lián)關系
# 作者沒了,詳情也沒:on_delete=models.CASCADE
# 出版社沒了,書還是那個出版社出版:on_delete=models.DO_NOTHING
# 部門沒了,員工沒有部門(空不能):null=True, on_delete=models.SET_NULL
# 部門沒了,員工進入默認部門(默認值):default=0, on_delete=models.SET_DEFAULT
# 13 db_constraint = False
# db_constraint = False表示邏輯上的關聯(lián),實際上沒有外鍵聯(lián)系,增刪不會受外鍵影響,orm查詢也不受影響,
# 不設置該參數(shù),你想刪出版社是不行的,因為出版社和書有關系;當刪了出版社,書表中可能就會出現(xiàn)臟數(shù)據(jù),就是書對應的出版社信息值不存在
自定義字段暫略
聚合函數(shù)通常是和分組一起使用的,關鍵字.aggregate()方法
# 先導入五個聚合函數(shù)
"""
小技巧:只要跟數(shù)據(jù)庫相關的模塊,基本上都在django.db.models里面
如果沒有則可能在django.db里面
"""
from django.db.models import Sum,Avg,Min,Max,Count
# 1.求書這個表里面的價格平均值和總合和最大值...單獨使用需要使用.aggregate方法
res = models.Book.objects.aggregate(Avg('price'),Max('price'),Sum('price'))
print(res)
返回的格式是:
分組查詢關鍵字annotate
# 1.統(tǒng)計每本書的作者個數(shù)
res = models.Book.objects.annotate(author_num=Count('author')).values('author_num')
print(res)
"""
說明:
1.分組查詢的關鍵字是annotate
2.models后面點什么,就是按什么分的組
3.author_num是自己自定義的字段,用來存統(tǒng)計出來的每本書對應的個數(shù)
4.count里面的author指的是統(tǒng)計作者的個數(shù)
5.values('author_num')是取出統(tǒng)計出來的作者個數(shù)
"""
# 2.統(tǒng)計每個出版社賣的最便宜書的價格
res = models.Publish.objects.annotate(book_price=Min('book__price')).values('name','book_price')
print(res)
print('=========')
# 3.統(tǒng)計作者個數(shù)不止一個的圖書
# 先按圖書分組,求出圖書對應的作者個數(shù);再filter過濾出作者個數(shù)大于1的
res = models.Book.objects.annotate(author_num=Count('author')).filter(author_num__gt=1).values('title','author_num')
print(res)
# 4.查詢每個作者出的書的總價格
res = models.Author.objects.annotate(book_price=Sum('book__price')).values('name','book_price')
print(res)
"""
那么如何按照字段分組呢?
models.Book.objects.values('price').annotate()
# 如果annotate前面出現(xiàn)了values,則它將不在按照book分組,而是按照values分組
"""
# F查詢
# 1.查詢賣出數(shù)大于庫存數(shù)的書籍
# F查詢
"""
能夠幫助你直接獲取到表中某個字段對應的數(shù)據(jù)
"""
from django.db.models import F # 導入f模塊
# res = models.Book.objects.filter(maichu__gt=F('kucun')) #f括號里放的是對應的字段名
# print(res)
# 2.將所有書籍的價格提升500塊
# models.Book.objects.update(price=F('price') + 500)
# 3.將所有書的名稱后面加上爆款兩個字
"""
在操作字符類型的數(shù)據(jù)的時候 F不能夠直接做到字符串的拼接
"""
from django.db.models.functions import Concat
from django.db.models import Value # 先導入Concat和Value模塊
models.Book.objects.update(title=Concat(F('title'), Value('爆款')))
# models.Book.objects.update(title=F('title') + '爆款') # 所有的名稱會全部變成空白
# Q查詢
# 1.查詢賣出數(shù)大于100或者價格小于600的書籍
# res = models.Book.objects.filter(maichu__gt=100,price__lt=600)
"""filter括號內(nèi)多個參數(shù)是and關系,并不能得到結(jié)果"""
from django.db.models import Q # 導入q模塊,實現(xiàn)或和not功能
# res = models.Book.objects.filter(Q(maichu__gt=100),Q(price__lt=600)) # Q包裹逗號分割 還是and關系
# res = models.Book.objects.filter(Q(maichu__gt=100)|Q(price__lt=600)) # | or關系
# res = models.Book.objects.filter(~Q(maichu__gt=100)|Q(price__lt=600)) # ~ not關系
# print(res) #
# Q的高階用法 能夠?qū)⒉樵儣l件的左邊也變成字符串的形式
q = Q()
q.connector = 'or'
q.children.append(('maichu__gt',100))
q.children.append(('price__lt',600))
res = models.Book.objects.filter(q) # 默認還是and關系
print(res)