單表操作
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')
?
?
?
?
?
?
?