Django08:模型层(ORM)--测试脚本/必知的13条/神器的双下划线查询/多表操作
生活随笔
收集整理的這篇文章主要介紹了
Django08:模型层(ORM)--测试脚本/必知的13条/神器的双下划线查询/多表操作
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
單表操作
django 自帶的sqlite3數(shù)據(jù)庫對日期格式不是很敏感,處理的時候容易出錯。
?
測試腳本
測試環(huán)境準(zhǔn)備:去manage.py 中拷貝錢四行代碼,然后自己手寫兩行。
腳本無論在引用下面,還是單獨(dú)開設(shè)PY文件都可以。
import os import sysif __name__ == "__main__":os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysiteday62.settings")#手寫2行import djangodjango.setup()#所有代碼都必須在下面,包括import命令from app01 import models#不需要遷移命令#增user_obj=models.User(username=username,password=password)User_obj.save() #保存數(shù)據(jù)#刪除 models.Book.objects.filter(pk=2).delete()#pk會自動查找當(dāng)前表的主鍵字段#用了PK,不需要查看主鍵字段名字 uid pid sid...#第二種usr_obj=models.Book.objects.filter(pk=2)usr_obj.delete()#修改#get 不推薦,沒有數(shù)值會報錯edit_book_obj = models.Book.objects.get(pk=edit_id)#推薦models.Book.objects.filter(pk=edit_id).update(book_title=new_title ,publisher=new_publisher_id )?
必知的13條
1.all() 2.filter() 可以主鍵用pk替代 3.get() 直接拿數(shù)據(jù),但條件不存在會報錯。 4.first() 5.last()6.values() #指定獲取的數(shù)據(jù)的字段。返回結(jié)果列表套字典res=models.User.objects.values('name','age')7. values_list() #返回列表套元組res.query 查看sql語句方式,只有queryset對象才行8.distinct() 去重復(fù),有主鍵不能去除,一定要一模一樣的數(shù)據(jù),一定不要忽略主鍵9. order_by() res=models.User.objects.order_by('age') 默認(rèn)升序 res=models.User.objects.order_by('-age') #降序 加‘-’10. reverse() 反轉(zhuǎn),前提是 數(shù)據(jù)已經(jīng)排序,跟在order_by()11. count() #統(tǒng)計(jì)個數(shù)12. exclude() #排除在外 res=models.User.objects.exclude(name='jason')13. exists() #是否存在,返回布爾值. 基本用不到,數(shù)據(jù)包含布爾值。?
神器的雙下劃線查詢
#查詢小于35歲 res=models.User.objects.filter(age__lt=35)#小于等于 res=models.User.objects.filter(age__lte=30)#年齡18,或者32,或者40 res=models.User.objects.filter(age__in=[18,32,40])#18到40歲 res=models.User.objects.filter(age__range=[18,40])#名字還有“n”,默認(rèn)區(qū)分大小寫res=models.User.objects.filter(name__contains='n')#忽略大小寫 res=models.User.objects.filter(name__icontains='n')#開頭,結(jié)尾 res=models.User.objects.filter(name__startswith='n') res=models.User.objects.filter(name__endswith='n')#注冊時間2020 1月份 res=models.User.objects.filter(register_time__month='1') res=models.User.objects.filter(register_time__year'2020')ret = models.Person.objects.filter(birthday__year=2000, birthday__month=5)?
多表操作
一對多
#增 #1.直接字段 id models.Books.objects.create(tittle='sanguo',price=123.23,pblicsh_id=1)#2.虛擬字段,對象 publish_obj=models.Publish.objects.filter(pk=2),first() models.Books.objects.create(tittle='sanguo',price=123.23,pblicsh=publish_obj)#刪除,默認(rèn)級聯(lián),刪了一個,另外關(guān)聯(lián)表也刪除。 models.Publish.objects.filter(pk=1).delete()#修改#1 models.Books.objects.filter(pk=1).update(publish_id=2)#2 publish_obj=models.Publish.objects.filter(pk=2),first() models.Books.objects.filter(pk=1).update(publish=publish_obj)多對多
# 多對多 增刪改查 就是在操作第三張表#book與authors 多對多#-----增-------- book_obj=models.Book.objects.filter(pk=1).first() #主鍵為1的書籍,添加一個主鍵為1的作者 book_obj.authors.add(1) #因?yàn)槎鄬Χ?#xff0c;可以添加多個。 book_obj.authors.add(2,3) #方法二 author_obj1=models.Author.objects.filter(pk=1),first() author_obj2=models.Author.objects.filter(pk=2),first() author_obj3=models.Author.objects.filter(pk=3),first() book_obj.authors.add(author_obj1,author_obj2,author_obj3) add給第三張表添加數(shù)據(jù),可以數(shù)字也可以對象。#--------刪-----------book_obj.authors.remove(2) book_obj.authors.remove(1,3)#同樣支持對象 book_obj.authors.remove(author_obj1,author_obj2)#------------修改-----------book_obj.authors.set([1,3]) book_obj.authors.set([3]) #也支持對象#括號內(nèi)必須是,可迭代對象。#**先刪除,后新增#-------清空----------#在第三張表,清空某個書籍,與作者關(guān)系book_obj.authors.clear() #不需要參數(shù)。?
多表查詢
正反向概念
外鍵字段在book
book->publish 正向
publish->book 反向
口訣:
正向查找靠字段 :
反向查找靠小寫?? (結(jié)果為多個加_set, . 單個不用)
(結(jié)果為多個的時候,需要.all())
子查詢(基于對象的跨表查詢)
#1.查詢書籍主鍵為1的出版社 book_obj=models.Book.objects.filter(pk=1),first() #正向 res=book_obj.publish print(res.name)#2. 查詢書籍主鍵為2的作者 book_obj=models.Book.objects.filter(pk=2),first() #正向 res=book_obj.authors.all() #3. 查詢作者jason的電話號碼 author_obj=models.Author.objects.filter(name='jason').first() res=author_obj.author_detail print(res.phone)什么時候加.all() 結(jié)果為多個加.all()#4.查詢出版社為東方出版社的書 publish_obj=models.Publis.objects.filter(name='東方出版社').first() #反向, 表名小寫 加_set res=publish_obj.book_set.all()#5. 查詢作者為jason的書 author_obj=models.Author.objects.filter(name='jason') res=author_obj.book_set.all() print(res)#6. 查詢手機(jī)號為110的作者姓名 author_detail_obj=models.AuthorDetail.objects.filter(phone=110).first() res=auther_detail_obj.author print(res.name)#***但結(jié)果為單個,就不用_set?
基于雙下劃線跨表查詢
#1.查詢jason的手機(jī)號和名字 res=models.Author.objects.filter(name='jason').values('author_detail__phone','name')#反向 res=models.AuthorDetail.objects.filter(author__name='jason').values('phone',author__name)#2. 查詢主鍵為1的出版社名字和書的名字 res=models.Book.objects.filter(pk=1).values('title','publish__name') #表名小寫 #反向 res=models.Publish.objects.filter(book__id=1).valus('name','book__title')#3. 查詢書籍主鍵為1的作者姓名 res=models.Book.objects.filter(pk=1).value('authors__name') res=models.Author.objects.filter(book__id=1),values('name')#4. 書籍主鍵1的作者的手機(jī)號 res=models.Book.objects.filter(pk=1),values('authors__author_detail__phone')?
?
?
?
?
?
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Django08:模型层(ORM)--测试脚本/必知的13条/神器的双下划线查询/多表操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django07:模板语法/标签/inc
- 下一篇: Django08-1:模型层(ORM)-