淺談在django中使用filter()(即對(duì)QuerySet操作)時(shí)踩的坑
代碼伺候:
先看如下代碼:
例1:
message = Message.objects.filter(pk=message_id2) message[0].id = message_id2 message[0].content = content2 message[0].message_type = message_type2print(message[0].id)print(message[0].content) message[0].save()
可正常從QuerySet中讀取數(shù)據(jù),并打印出來(lái),無(wú)誤。可是無(wú)法將數(shù)據(jù)同步到數(shù)據(jù)庫(kù)中。
(1)all()返回的是QuerySet對(duì)象,程序并沒(méi)有真的在數(shù)據(jù)庫(kù)中執(zhí)行SQL語(yǔ)句查詢數(shù)據(jù),但支持迭代,使用for循環(huán)可以獲取數(shù)據(jù)。
例如有Book表,其包含bookname,booknum兩個(gè)屬性, 如何使用Objects.all(),得到bookname和booknum的值
(2)filter() 返回的是QuerySet對(duì)象,與all()相似,只是all()是查詢所有數(shù)據(jù),常用:filter表示‘ = ’,exclude表示’ != ’。
(3)get()返回的是Model對(duì)象,類(lèi)型為列表,說(shuō)明使用get方法會(huì)直接執(zhí)行sql語(yǔ)句獲取數(shù)據(jù)。
來(lái)看一個(gè)QuerySet對(duì)象:
message = Message.objects.filter(pk=message_id2)message[0].content
這樣子確實(shí)可以讀取到QuerySet中的數(shù)據(jù),可是對(duì)QuerySet修改后的數(shù)據(jù)無(wú)法保存到數(shù)據(jù)庫(kù)。
例1中不要嘗試通過(guò)message.save()的方式去同步數(shù)據(jù)到數(shù)據(jù)庫(kù),因?yàn)镼uerySet不存在save()方法。
正確寫(xiě)法如下:
要想同步到數(shù)據(jù)庫(kù)中,需使用對(duì)象進(jìn)行數(shù)據(jù)同步操作。
例2:
message = Message.objects.filter(pk=message_id2).first() message.id = message_id2 message.content = content2 message.message_type = message_type2 message.save()
補(bǔ)充知識(shí):Django filter和get的個(gè)人體會(huì)
開(kāi)發(fā)環(huán)境:Ubuntu16.04+Django 1.11.9+Python2.7
filter返回的QuerySet:
filter返回的是QuerySet,可以切片以及遍歷,get則不行.因?yàn)間et只能獲取唯一存在的數(shù)據(jù),不存在或者存在多條都會(huì)報(bào)錯(cuò).
在沒(méi)有符合條件的值的時(shí)候:
get會(huì)報(bào)錯(cuò)
Book matching query does not exist.
filter則返回一個(gè)空列表,并不會(huì)報(bào)錯(cuò).
<QuerySet []>`
繼續(xù)往下執(zhí)行代碼
判斷filter是否有值的時(shí)候:
book_info = Book.objects.filter(id=book_id, request_type=2)
queryset.exists()if book_info.exists():
queryset.count==0:if queryset.count>0: passelse: pass
if queryset:if queryset: passelse: pass
filter也會(huì)有報(bào)錯(cuò)的情況:
filter字段類(lèi)型為int的時(shí)候,輸入的參數(shù)卻是str的時(shí)候會(huì)報(bào)錯(cuò):
invalid literal for int() with base 10: ’Yu’
使用get的時(shí)候,錯(cuò)誤信息與上面filter一致.
filter字段存在,但是filter不到對(duì)應(yīng)值的時(shí)候:
輸出為:<QuerySet []>
為空的時(shí)候,自然也不能[0],取值.
使用filter作為過(guò)濾條件更新數(shù)據(jù)的時(shí)候:
Book.objects.filter(id=book_id, request_type=2).order_by('-time')[0].update(result=note)
會(huì)報(bào)錯(cuò):
’Book’ object has no attribute ’update’
使用filter不能部分更新,必須更新所有符合條件的.
但是可以使用[0]可以獲取符合過(guò)濾條件的第一個(gè)值,
解決辦法,使用save():
book_info = Book.objects.filter(id=book_id, request_type=2).order_by('-time')[0]book_info.result = notebook_info.save()
filter 字段后常見(jiàn)的
這里是雙下劃線,__
__gt 大于__gte 大于等于__lt 小于__lte 小于等于__contains 包含 __icontains 包含 忽略大小寫(xiě) __startswith 以...開(kāi)頭__istartswith 以...開(kāi)頭 忽略大小寫(xiě)__endswith 以...結(jié)尾__iendswith 以...結(jié)尾,忽略大小寫(xiě)
以上這篇淺談在django中使用filter()(即對(duì)QuerySet操作)時(shí)踩的坑就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. JSP數(shù)據(jù)交互實(shí)現(xiàn)過(guò)程解析2. 解決啟動(dòng)django,瀏覽器顯示“服務(wù)器拒絕訪問(wèn)”的問(wèn)題3. Nginx+php配置文件及原理解析4. vue使用webSocket更新實(shí)時(shí)天氣的方法5. Yii2.0引入CSS,JS文件方法6. Opencv+Python識(shí)別PCB板圖片的步驟7. ASP.NET MVC獲取多級(jí)類(lèi)別組合下的產(chǎn)品8. python使用selenium爬蟲(chóng)知乎的方法示例9. 討論CSS中的各類(lèi)居中方式10. 如何使用CSS3畫(huà)出一個(gè)叮當(dāng)貓
