日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django08:模型层(ORM)--测试脚本/必知的13条/神器的双下划线查询/多表操作

發布時間:2023/12/4 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django08:模型层(ORM)--测试脚本/必知的13条/神器的双下划线查询/多表操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單表操作

django 自帶的sqlite3數據庫對日期格式不是很敏感,處理的時候容易出錯。

?

測試腳本

測試環境準備:去manage.py 中拷貝錢四行代碼,然后自己手寫兩行。

腳本無論在引用下面,還是單獨開設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() #保存數據#刪除 models.Book.objects.filter(pk=2).delete()#pk會自動查找當前表的主鍵字段#用了PK,不需要查看主鍵字段名字 uid pid sid...#第二種usr_obj=models.Book.objects.filter(pk=2)usr_obj.delete()#修改#get 不推薦,沒有數值會報錯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() 直接拿數據,但條件不存在會報錯。 4.first() 5.last()6.values() #指定獲取的數據的字段。返回結果列表套字典res=models.User.objects.values('name','age')7. values_list() #返回列表套元組res.query 查看sql語句方式,只有queryset對象才行8.distinct() 去重復,有主鍵不能去除,一定要一模一樣的數據,一定不要忽略主鍵9. order_by() res=models.User.objects.order_by('age') 默認升序 res=models.User.objects.order_by('-age') #降序 加‘-’10. reverse() 反轉,前提是 數據已經排序,跟在order_by()11. count() #統計個數12. exclude() #排除在外 res=models.User.objects.exclude(name='jason')13. exists() #是否存在,返回布爾值. 基本用不到,數據包含布爾值。

?

神器的雙下劃線查詢

#查詢小于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”,默認區分大小寫res=models.User.objects.filter(name__contains='n')#忽略大小寫 res=models.User.objects.filter(name__icontains='n')#開頭,結尾 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)#刪除,默認級聯,刪了一個,另外關聯表也刪除。 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) #因為多對多,可以添加多個。 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給第三張表添加數據,可以數字也可以對象。#--------刪-----------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]) #也支持對象#括號內必須是,可迭代對象。#**先刪除,后新增#-------清空----------#在第三張表,清空某個書籍,與作者關系book_obj.authors.clear() #不需要參數。

?

多表查詢

正反向概念

外鍵字段在book

book->publish 正向

publish->book 反向

口訣:

正向查找靠字段 :

反向查找靠小寫?? (結果為多個加_set, . 單個不用)

(結果為多個的時候,需要.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() 結果為多個加.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. 查詢手機號為110的作者姓名 author_detail_obj=models.AuthorDetail.objects.filter(phone=110).first() res=auther_detail_obj.author print(res.name)#***但結果為單個,就不用_set

?

基于雙下劃線跨表查詢

#1.查詢jason的手機號和名字 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的作者的手機號 res=models.Book.objects.filter(pk=1),values('authors__author_detail__phone')

?

?

?

?

?

?

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Django08:模型层(ORM)--测试脚本/必知的13条/神器的双下划线查询/多表操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。