django中操作mysql數(shù)據(jù)庫的方法
1.準(zhǔn)備工作(django連接數(shù)據(jù)庫)
1.本機(jī)電腦下載好mysql數(shù)據(jù)庫
2.打開django,修改setting.py中的DATABASES配置項(xiàng)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'python', 'USER': 'root', 'PASSWORD': 'zy199909237412', 'HOST': '127.0.0.1', 'POST': '3306', } }
3.在pycharm的右側(cè)欄點(diǎn)擊database或者做下角點(diǎn)擊database,連接數(shù)據(jù)庫,如果都沒有,則去pluging里面尋找是否裝了database插件!!
或者
4.輸入需要連接的數(shù)據(jù)庫
5.這里沒有下載驅(qū)動(dòng)的需要先下載,不然連接不上
6.在django項(xiàng)目中的__init__.py中導(dǎo)入pymysql,告訴django使用pymysql連接數(shù)據(jù)庫,而不是mysqldb模塊
import pymysql pymysql.install_as_MySQLdb()
7.簡單使用pycharm操作數(shù)據(jù)庫
2.django操作數(shù)據(jù)庫(ORM)
2.1 ORM簡介
對象關(guān)系映射(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)。ORM在業(yè)務(wù)邏輯層和數(shù)據(jù)庫層之間充當(dāng)了橋梁的作用
簡單來說,ORM就是使用面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫!
(1)ORM的優(yōu)勢:
1.將表和類一一對應(yīng),類的每個(gè)實(shí)例對應(yīng)表中的一條記錄,類的每個(gè)屬性對應(yīng)表中的每個(gè)字段。
2.ORM提供了對數(shù)據(jù)庫的映射,不用直接編寫SQL代碼,只需操作對象就能對數(shù)據(jù)庫操作數(shù)據(jù),提高了工作效率
(2)ORM的劣勢
1.一些查詢操作完成不了
2.一定程度上犧牲了程序的執(zhí)行效率
3.用久了會(huì)忘SQL語言
2.2 創(chuàng)建表和字段
from django.db import models # 1.導(dǎo)入models模塊 # 2.定義一個(gè)類繼承models.Model類(創(chuàng)建一張項(xiàng)目名(應(yīng)用名)_類名的表) class Book(models.Model): # 3.定義類屬性title和price(對應(yīng)是創(chuàng)建字段名、字段類型和字段選項(xiàng)) title = models.CharField('書名', max_length=50, default='') price = models.DecimalField('價(jià)格', max_digits=7, decimal_places=2) class 模型類名(models.Model): 字段名 = models.字段類型(字段選項(xiàng)) 在類里面不指定主鍵字段,django會(huì)幫您自動(dòng)創(chuàng)建一個(gè)id主鍵!
注意:對于數(shù)據(jù)庫的增刪改查之后都要進(jìn)行數(shù)據(jù)庫遷移
1.執(zhí)行python3 manage.py makemigration---將應(yīng)用下的model.py文件生成一個(gè)中間件文件,并保存在migrations文件中
2.執(zhí)行python3 manage.py migrate ----將每個(gè)應(yīng)用下的migrations目錄中的中間文件同步回?cái)?shù)據(jù)庫
2.3 字段的增刪改查
1.增加字段
直接在對應(yīng)的類里面添加字段、字段類型和字段選項(xiàng) 注意增加的字段都需要指定default = '' 或者null = True,如下添加info字段: info = models.CharField(max_length=32,default='',null=True)
2.修改字段
直接在類里面修改對應(yīng)字段就行!
然后執(zhí)行數(shù)據(jù)庫遷移命令!
3.字段的刪除
直接在類里面將需要?jiǎng)h的字段注釋掉就行!
然后執(zhí)行數(shù)據(jù)庫遷移命令!注意:執(zhí)行完畢了,數(shù)據(jù)庫對應(yīng)的數(shù)據(jù)就沒有了!慎重?。?!
2.4 單表數(shù)據(jù)的增刪改查
每個(gè)繼承model.Model的模型類,都有一個(gè)objects對象被同樣繼承下來,這個(gè)對象叫管理器對象,數(shù)據(jù)庫的增刪改查都是通過模型的管理器實(shí)現(xiàn)。
對于數(shù)據(jù)的增刪改查,其實(shí)最主要的都是在views.py的視圖函數(shù)里完成的!因此,我們需要在視圖函數(shù)里進(jìn)行數(shù)據(jù)庫的增刪改查操作!
2.4.1單表數(shù)據(jù)的查詢
1.filter()查詢方法
from app01 import models # 1.導(dǎo)入自己創(chuàng)建的模型類 # 2.filter查詢方法,語法是:models.類名.objects.filter(),filter內(nèi)可以查詢多個(gè)參數(shù),默認(rèn)是and連接,等于SQL語法的where方法!,不傳參時(shí)代表查所有 res = models.MyModle.objects.filter(username=username) # 該方法有一個(gè)返回值,返回的是一個(gè)queryset對象,該對象可以看成是列表套字典的形式,列表里面套著一個(gè)個(gè)數(shù)據(jù)對象,形式為:[數(shù)據(jù)對象1,數(shù)據(jù)對象2] # queryset列表也支持索引,切片操作,但是不支持負(fù)數(shù)索引,可以當(dāng)成列表套字典的形式for循環(huán) user_obj = res[0] # 得到的是具體的數(shù)據(jù)對象,但是官方不推薦使用索引的方式取到具體的數(shù)據(jù)對象,它推薦的是res.first()方法取到列表里的第一個(gè)數(shù)據(jù)對象! print(user_obj.username) # 通過點(diǎn)大法,即.屬性的方法得到具體的值
2.all()查詢所有方法
# all方法查詢User表的所有數(shù)據(jù),返回的是一個(gè)queryset對象列表, user_queryset = models.User.objects.all()
2.4.2單表數(shù)據(jù)的增加
1.create()方法
# create增加數(shù)據(jù)方法,語法是:models.類名.objects.create() res = models.MyModle.objects.create(username=username,password=password) # 該方法也有一個(gè)返回值,返回的是當(dāng)前這個(gè)數(shù)據(jù)對象 print(res.username,res.password) # 可以通過點(diǎn)屬性的方法,查看到對應(yīng)屬性的值
2.save()方法
obj = models.User(username=username,password=password) obj.save() # 保存數(shù)據(jù)到數(shù)據(jù)庫
2.4.3單表數(shù)據(jù)的修改
1.upadte()方法:先查出來,在更新
# 查出id為什么的對象,然后進(jìn)行批量更新。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() # 最后賦值完記得需咬保存
2.4.4單表數(shù)據(jù)刪除
1.delete()方法:用于批量刪除
# 先filter查出需要?jiǎng)h除的對象,然后.delete()方法 models.User.objects.filter(id=delete_id).delete() # 這里是把filter查出來的queryset對象里全部刪除了,有幾個(gè)刪幾個(gè)。 # 這里的id可以改寫成pk,用了pk就不需要知道表的主鍵是id還是其他什么了!
2.單一刪除
res = models.User.objects.filter(id=delete_id).first() res.delete() # 單一刪除
2.4.5補(bǔ)充13條單表查詢
# 1.all() 查詢所有數(shù)據(jù) # 2.filter() 帶有過濾條件的查詢,拿到的是一個(gè)queryset對象列表 # 3.get() 直接拿數(shù)據(jù)對象 但是條件不存在直接報(bào)錯(cuò) # 4.first() 拿queryset里面第一個(gè)元素 # res = models.User.objects.all().first() # print(res) # 拿到queryset對象列表里的第一個(gè)數(shù)據(jù)對象 # 5.last() # res = models.User.objects.all().last() # print(res) # 同上,拿到的是最好一個(gè) # 6.values() 可以指定獲取的數(shù)據(jù)字段 select name,age from ... # res = models.User.objects.values('name','age') # print(res) # 結(jié)果為:列表套字典<QuerySet [{'name': 'jason', 'age': 18}, {'name': 'egonPPP', 'age': 84}]> # 7.values_list() # res = models.User.objects.values_list('name','age') # print(res) # 結(jié)果為:列表套元祖,<QuerySet [('jason', 18), ('egonPPP', 84)]> # 8.query # print(res.query) # 查看內(nèi)部封裝的sql語句 # 上述查看sql語句的方式 只能用于queryset對象 # 只有queryset對象才能夠點(diǎn)擊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') # 默認(rèn)升序 # 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)計(jì)當(dāng)前數(shù)據(jù)的個(gè)數(shù) # res = models.User.objects.count() # print(res) # 12.exclude() 排除在外 # res = models.User.objects.exclude(name='jason') # print(res) # 13.exists() #基本用不到因?yàn)閿?shù)據(jù)本身就自帶布爾值 返回的是布爾值 # res = models.User.objects.filter(pk=10).exists() # 判讀主鍵為10的是否存在,返回是布爾值 # print(res)
2.4.6 神奇的雙下劃線查詢
__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ù)
2.5 多表數(shù)據(jù)操作
2.5.1 orm創(chuàng)建表關(guān)系
表的關(guān)系有三種,分別是:一對一、一對多、多對多
判斷表和表之間的關(guān)系:換位思考法
具體創(chuàng)建表關(guān)系語法:
""" 圖書和出版社:一對多關(guān)系,外鍵建在多的一方 圖書和作者:多對多關(guān)系,外鍵建在任何一方,但是推薦建在查詢頻率高的一方 作者和作者詳情:一對一關(guān)系,外鍵建在任何一方,但是推薦建在查詢頻率高的一方 """ 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='是需要建立外鍵的那一個(gè)類名publish' # 注意:在django2、3里面需要指定級聯(lián)刪除參數(shù)on_delete=models.CASCADE publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE) # 多對多外鍵建在查詢頻率高的一方,多對多在sql語句中需要自己手動(dòng)建第三張表,但是在django中,django遇到會(huì)自動(dòng)幫你創(chuàng)建第三張表! author = models.ManyToManyField(to='Author') 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)
2.5.2 一對多關(guān)系的增刪改
from app01 import models # 1.增 # 法1:直接寫book表里面的外鍵的實(shí)際字段名,然后指定關(guān)聯(lián)publish的id就行 models.Book.objects.create(title='活著',price=33,publish_id=1) # 法2:虛擬字段,傳入一個(gè)具體的publish的數(shù)據(jù)對象就行 publish_obj = models.Publish.objects.filter(pk=2).first() # 注意這里需要.first()一下,因?yàn)椴稽c(diǎn)拿到的是queryset對象,點(diǎn)一下拿到queryset里的具體數(shù)據(jù)對象 models.Book.objects.create(title='我',price=555,publish=publish_obj) # 2.刪 models.Publish.objects.filter(pk=2).delete() # 將book里關(guān)聯(lián)id=2的也全部刪除 # 3.改 # 法1:update里面?zhèn)骶唧w需要修改的外鍵字段名和值 models.Book.objects.filter(pk=2).update(publish_id=2) # 將id為2的書的關(guān)聯(lián)publish_id改成2 # 法2:update里面?zhèn)魅胩摂M字段publish=需要關(guān)聯(lián)的publish數(shù)據(jù)對象,同增的法2
2.5.3 多對多關(guān)系的增刪改
# 1.增 # 一本書對應(yīng)多個(gè)作者,先查出這個(gè)書的對象,在通過對象.多對多字段名.add()方法關(guān)聯(lián)作者id # add()方法里面可以法數(shù)字1,2,3,表示關(guān)聯(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.刪 # 刪除這邊書關(guān)聯(lián)的作者id為1和2的,和add方法一樣也支持里面放具體的作者數(shù)據(jù)對象!! book_obj.author.remove(1,2) # 3.改 # set方法修改該書關(guān)聯(lián)的作者id為1和3,set方法和add方法一樣也支持里面放具體的作者數(shù)據(jù)對象??! # 注意:set方法里面必須放一個(gè)可迭代對象,比如列表! book_obj.author.set([1,3]) # 4.清空當(dāng)前書和作者的對應(yīng)關(guān)系 book_obj.author.clear()
2.5.4 多表的查詢操作
查詢的時(shí)候,分正方向查詢,外鍵字段在我手上,我查你就是正向查詢;反之,不在我手上,我查你就是反向查詢。
查詢口訣:正向查詢按字段,反向查詢按表名小寫;
1.基于對象的多表查詢
from app01 import models # 1.查詢書籍主鍵為1的出版社名稱 ----正向一對多查詢 book_obj = models.Book.objects.filter(pk=1).first() # 先得到主鍵為1的書籍對象 res = book_obj.publish # 正向查詢按字段,Book表里面有一個(gè)publish字段,返回一個(gè)與主鍵1關(guān)聯(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()返回的是一個(gè)app01.Author.None print(res) # .all()返回的是<QuerySet [<Author: Author object (1)>, <Author: Author object (2)>]>,書籍id為1對應(yīng)兩個(gè)作者 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),是一個(gè)作者詳情對象 print(res.phone) # .字段查出對應(yīng)作者的詳情信息 """ 總結(jié):正向查詢時(shí),當(dāng)你的結(jié)果可能是多個(gè)的時(shí)候,就需要加.all(),如果是一個(gè)直接拿到數(shù)據(jù)對象 """ # 4.查詢出版社是東風(fēng)出版社的書----反向一對多查詢 publish_obj = models.Publish.objects.filter(name='東風(fēng)').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.查詢電話號碼是122324233的作者 author_detail_obj = models.AuthorDetail.objects.filter(phone=122324233).first() res = author_detail_obj.author print(res.name) """ 總結(jié):反向查詢的時(shí)候,如果結(jié)果為多個(gè),就需要加_set.all();如果是一對一結(jié)果就一個(gè),就不用! """
2.基于雙下劃線__的多表查詢
from app01 import models # 1.查詢王這個(gè)作者的年齡和手機(jī)號--正向一對一查詢 # 先得到王這個(gè)對象,然后.values,里面放需要查詢的字段名,正向則直接'字段名';反向則'表名小寫__字段名' res = models.Author.objects.filter(name='王').values('age','author_detail__phone') print(res) # 得到的是一個(gè)queryset對象(列表里套了一個(gè)字典) dict = res.first() # .first()方法取到該字典對象 print(dict['age']) # 字典方式取到具體需要的值 # 反向查詢 res = models.AuthorDetail.objects.filter(author__name='王').values('phone','author__age') print(res) # 2.查詢書籍主鍵為1的出版社名字和書的價(jià)格---正向一對多查詢 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)
2.6 字段類型與字段選項(xiàng)
from django.db import models # Create your models here. class MyBook(models.Model): # 1.字符串字段類型CharField,必須傳的字段選項(xiàng)是max_length=指定最大字符數(shù),verbose_name=''指定該字段在django后臺管理中的描述名 name = models.CharField(max_length=32,verbose_name='姓名') # 2.數(shù)字字段類型IntegerField age = models.IntegerField() # 3.日期時(shí)間字段類型DateTimeField register_time = models.DateTimeField(auto_now_add=True) # 4.日期字段類型 register_time = models.DateField(auto_now_add=True) # 針對這兩個(gè)字段類型,有兩個(gè)關(guān)鍵性參數(shù) # auto_now:每次操作數(shù)據(jù)的時(shí)候,該字段會(huì)自動(dòng)將當(dāng)前時(shí)間更新 # auto_now_add:在創(chuàng)建數(shù)據(jù)的時(shí)候會(huì)自動(dòng)將當(dāng)前時(shí)間記錄下來,以后只要不認(rèn)為修改就一直不變 # 5.郵箱字段 email = models.EmailField() # 6.大數(shù)字字段類型 phone = models.BigIntegerField() # 7.小數(shù)字段,有兩個(gè)字段選項(xiàng)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ù)庫中對應(yīng)0\1 boolean = models.BooleanField(False) # 9.文本字段類型,沒有字?jǐn)?shù)限制,大文本 text = models.TextField() # 10.文件字段類型,upload_to=''參數(shù):給該字段傳一個(gè)文件對象,會(huì)自動(dòng)將該文件保存在/data目錄下,如何把該文件的路徑傳到數(shù)據(jù)庫中 file = models.FileField(upload_to='/data') 自定義字段暫略
2.7聚合查詢
聚合函數(shù)通常是和分組一起使用的,關(guān)鍵字.aggregate()方法
# 先導(dǎo)入五個(gè)聚合函數(shù) """ 小技巧:只要跟數(shù)據(jù)庫相關(guān)的模塊,基本上都在django.db.models里面 如果沒有則可能在django.db里面 """ from django.db.models import Sum,Avg,Min,Max,Count # 1.求書這個(gè)表里面的價(jià)格平均值和總合和最大值...單獨(dú)使用需要使用.aggregate方法 res = models.Book.objects.aggregate(Avg('price'),Max('price'),Sum('price')) print(res)
2.8分組查詢
分組查詢關(guān)鍵字annotate
# 1.統(tǒng)計(jì)每本書的作者個(gè)數(shù) res = models.Book.objects.annotate(author_num=Count('author')).values('author_num') print(res) """ 說明: 1.分組查詢的關(guān)鍵字是annotate 2.models后面點(diǎn)什么,就是按什么分的組 3.author_num是自己自定義的字段,用來存統(tǒng)計(jì)出來的每本書對應(yīng)的個(gè)數(shù) 4.count里面的author指的是統(tǒng)計(jì)作者的個(gè)數(shù) 5.values('author_num')是取出統(tǒng)計(jì)出來的作者個(gè)數(shù) """ # 2.統(tǒng)計(jì)每個(gè)出版社賣的最便宜書的價(jià)格 res = models.Publish.objects.annotate(book_price=Min('book__price')).values('name','book_price') print(res) print('=========') # 3.統(tǒng)計(jì)作者個(gè)數(shù)不止一個(gè)的圖書 # 先按圖書分組,求出圖書對應(yīng)的作者個(gè)數(shù);再filter過濾出作者個(gè)數(shù)大于1的 res = models.Book.objects.annotate(author_num=Count('author')).filter(author_num__gt=1).values('title','author_num') print(res) # 4.查詢每個(gè)作者出的書的總價(jià)格 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分組 """
2.9F與Q查詢
2.9.1F查詢
# F查詢 # 1.查詢賣出數(shù)大于庫存數(shù)的書籍 # F查詢 """ 能夠幫助你直接獲取到表中某個(gè)字段對應(yīng)的數(shù)據(jù) """ from django.db.models import F # 導(dǎo)入f模塊 # res = models.Book.objects.filter(maichu__gt=F('kucun')) #f括號里放的是對應(yīng)的字段名 # print(res) # 2.將所有書籍的價(jià)格提升500塊 # models.Book.objects.update(price=F('price') + 500) # 3.將所有書的名稱后面加上爆款兩個(gè)字 """ 在操作字符類型的數(shù)據(jù)的時(shí)候 F不能夠直接做到字符串的拼接 """ from django.db.models.functions import Concat from django.db.models import Value # 先導(dǎo)入Concat和Value模塊 models.Book.objects.update(title=Concat(F('title'), Value('爆款'))) # models.Book.objects.update(title=F('title') + '爆款') # 所有的名稱會(huì)全部變成空白
2.9.2Q查詢
# Q查詢 # 1.查詢賣出數(shù)大于100或者價(jià)格小于600的書籍 # res = models.Book.objects.filter(maichu__gt=100,price__lt=600) """filter括號內(nèi)多個(gè)參數(shù)是and關(guān)系,并不能得到結(jié)果""" from django.db.models import Q # 導(dǎo)入q模塊,實(shí)現(xiàn)或和not功能 # res = models.Book.objects.filter(Q(maichu__gt=100),Q(price__lt=600)) # Q包裹逗號分割 還是and關(guān)系 # res = models.Book.objects.filter(Q(maichu__gt=100)|Q(price__lt=600)) # | or關(guān)系 # res = models.Book.objects.filter(~Q(maichu__gt=100)|Q(price__lt=600)) # ~ not關(guān)系 # print(res) # <QuerySet []> # 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) # 默認(rèn)還是and關(guān)系 print(res)
到此這篇關(guān)于django中操作mysql數(shù)據(jù)庫的方法的文章就介紹到這了,更多相關(guān)django操作mysql內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
win7上tensorflow2.2.0安裝成功 引用DLL load failed時(shí)找不到指定模塊 tensorflo
這篇文章主要介紹了win7上tensorflow2.2.0安裝成功 引用時(shí)DLL load failed找不到指定模塊 tensorflow has no attribute xxx 解決方法,需要的朋友可以參考下2020-05-05Django?事務(wù)回滾的具體實(shí)現(xiàn)
本文主要介紹了Django?事務(wù)回滾的具體實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python?queue雙端隊(duì)列模塊及用法小結(jié)
雙端隊(duì)列是一種具有隊(duì)列和棧性質(zhì)的線性數(shù)據(jù)結(jié)構(gòu),本文主要介紹了Python?queue雙端隊(duì)列模塊及用法小結(jié),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02Numpy創(chuàng)建NumPy矩陣的簡單實(shí)現(xiàn)
本文主要介紹了Numpy創(chuàng)建NumPy矩陣的簡單實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Django 限制用戶訪問頻率的中間件的實(shí)現(xiàn)
這篇文章主要介紹了Django 限制用戶訪問頻率的中間件的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08解決python中導(dǎo)入win32com.client出錯(cuò)的問題
今天小編就為大家分享一篇解決python中導(dǎo)入win32com.client出錯(cuò)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07DJANGO-URL反向解析REVERSE實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于DJANGO-URL反向解析REVERSE的相關(guān)知識點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-10-10