目錄python
Django測試環境搭建:拷貝manage.py中的行代碼放到tests.py文件中導入模塊sql
import django`,`django.setup()
若是你想查看orm語句內部真正的sql語句有2種方法:django
1.若是是queryset對象,就能夠.query查看該queryset對象的內部sql語句json
2.在settings.py
文件中配置測試
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level': 'DEBUG', }, }}
增code
models.Book.objects.create(title = '三國演義',price = 12.22)
book_obj = models.Book(title='三國演義',price='12.22') book_obj.save()
刪orm
models.Book.objects.filter(pk=2).delete()
改對象
models.Book.objects.filter(pk=2).update(title = '紅樓夢',price = 22.22)
查blog
res = models.Book.objects.filter(pk=2)
all():查全部,查詢結果爲Queryset對象排序
res = models.Book.objects.all() print(res)
filter:查詢結果爲Queryset對象
res = models.Book.objects.filter(pk=2)
get():查詢結果爲數據對象自己,和filter查詢類似,不推薦使用
res = models.Book.objects.get(pk=2)
first():查詢第一個
res = models.Book.objects.first()
last():查詢最後一個
res = models.Book.objects.last() #res能夠.title,.price
exclude():哪個排除以外
res = models.Book.objects.exclude(pk=3)
values():查詢結果爲列表套字典的Queryset對象
res = models.Book.objects.values('title')
value_list():查詢結果爲列表套元組的Queryset對象
res = models.Book.objects.values_list('title')
count():統計數據的條數
res = models.Book.objects.count('title') res = models.Book.objects.all.count('title')
distinct():數據必須是如出一轍的狀況下去重
res = models.Book.objects.distinct() #無變化 res = models.Book.objects.values('title').distinct()
order_by():排序
res = models.Book.objects.order_by('price') #默認升序 res = models.Book.objects.order_by('-price') #降序
reverse():排序後反轉(纔有意義)
res = models.Book.objects.reverse()
exists():是否存在
models.Book.objects.filter(pk=1).exists()
查詢價格大於200的書籍
models.Book.objects.filter(price__gt=200)
查詢價格小於200的書籍
models.Book.objects.filter(price__lt=200)
查詢價格大於等於200的書籍
models.Book.objects.filter(price__gte=200)
查詢價格小於等於200的書籍
models.Book.objects.filter(price__lte=200)
查詢價格是200元或者300元的書籍
res = models.Book.objects.filter(price__in=[200,300])
查詢價格是200到500元之間的書籍
res = models.Book.objects.filter(price__range=(200,500)) #顧頭不顧尾
查詢書籍中包含p的書籍
res = models.Book.objects.filter(title__contains='p') #區分大小寫 res = models.Book.objects.filter(title__icontains='p') #不區分大小寫
查詢書籍名稱是以三開頭的書籍
res = models.Book.objects.filter(title__startswith="三")
查詢書籍名稱是以三結尾的書籍
res = models.Book.objects.filter(title__endswith="三")
查詢出版日期是2019年的書籍
res = models.Book.objects.filter(data__year="2019")
查詢出版日期是10月份的書籍
res = models.Book.objects.filter(data__month="10")
增
models.Book.objects.create(title='xxx',price=66.66,publish_id=1)
publish_obj =models.Publish.objects.filter(pk=2).first() models.Book.objects.create(title='xxx',price=66.66, publish_id=publish_obj)
查
book_obj = models.Book.objects.filter(pk=1).first() print(book_obj.publish.name) print(book_obj.publish_id)
改
models.Book.objects.filter(pk=3).update(publish_id=3)
publish_obj = models.Publish.objects.filter(pk=1).first() models.Book.objects.filter(pk=3).update(publish_id=publish_obj) #給書更換出版社
刪
models.Book.objects.filter(pk=3).delete()
增
book_obj = models.Book.objects.filter(pk=3).first() print(book_obj.author) # 就至關於已經到書籍與做者的關係表中 book_obj.author.add(1) book_obj.author.add(2, 3) # 還能夠添加多個值 author_obj = models.Author.objects.filter(pk=1).first() book_obj.author.add(author_obj) author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=2).first() book_obj.author.add(author_obj, author_obj1) # 還能夠添加多個值 ''' add() 括號內 既能夠串數字,也能夠傳對象 而且支持傳多個 可是括號內必須是可迭代對象 '''
刪
#方式一 book_obj = models.Book.objects.filter(pk=3).first() book_obj.author.remove(2) book_obj.author.remove(1,2) #方式二 author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=2).first() book_obj.author.remove((author_obj, author_obj1)) ''' remove() 括號內 既能夠串數字,也能夠傳對象 而且支持傳多個 ''' #清空 book_obj = models.Book.objects.filter(pk=3).first() book_obj.author.clear() '''clear括號內不須要傳任何參數 直接清空當前書籍對象全部的記錄'''
改
#方式一 book_obj = models.Book.objects.filter(pk=3).first() book_obj.author.set([3, ]) #方式二 author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=2).first() book_obj.author.set((author_obj, author_obj1)) ''' set() 括號內 既能夠串數字,也能夠傳對象 而且支持傳多個 可是括號內必須是可迭代對象 '''
查
當該字段所對應的數據有多個的時候 須要加.all( )
,不然點外鍵字段直接就可以拿到數據對象
查詢書籍是Python入門的出版社名稱(一對多)
book_obj = models.Book.objects.filter(title='python入門').first() print(book_obj.publish.name) print(book_obj.publish.addr)
查詢書籍主鍵爲6的做者姓名(多對多)
book_obj = models.Book.objects.filter(pk=6).first() print(book_obj.author) #None print(book_obj.author.all()) #拿到當前這本書全部的做者
查詢做者是Jason的手機號(一對一)
author_obj = models.Author.objects.filter(name='jason').first() print(author_obj.author_detail.phone)
查詢出版社是東方出版社出版過的書籍
publish_obj = models.Publish.objects.filter(name="東方出版社").first() print(publish_obj.book_set.all())
查詢做者是Jason寫過的全部的書
author_obj = models.Author.objects.filter(name='json').first() print(author_obj.book_set.all())
查詢手機號是110的做者
phone_obj = models.AuthorDetail.objects.filter(phone=110).first() print(phone_obj.author)
查詢書籍是Python入門的出版社名稱
正向:
models.Book.objects.filter(name='python入門').values('publish__name')
反向:
models.Publish.objects.filter(book__title='python入門').value('name')
查詢做者是jason的手機號碼
正向:
models.Author.objects.filter(name='json').values('author_detail__phone')
反向
models.AuthorDetail.objects.filter(author__book__author='json').values('phone','author_age') #還能夠加本身的年齡
查詢手機號是120的做者姓名和地址
正向
models.AuthorDetail.objects.filter(phone='120').values('author__name')
反向
models.Author.objects.filter(author_detail__phone=120).values('name',,'author_detail__addr')
查詢出版社是東方出版社出版的書籍名稱
正向:
models.Publish.objects.filter(name='東方出版社').values('book__title')
反向:
models.Book.objects.filter(author__book__publish='東方出版社').values('title')
查詢做者是jason的寫過的書的名字和價格
正向:
models.Author.objects.filter(name='json').values('book__title','book__price')
反向:
models.Book.objects.filter(author__name='json').values('title','price')
查詢書籍是python入門的做者的手機號
正向:
models.Book.objects.filter(name='python入門').values('authors__author_detail__phone')
反向:
models.AuthorDetail.objects.filter(author__book__title='python入門').values('phone')
auto_now:每次修改數據的時候,都會自動更新時間
auto_now_add:在建立數據的時候,會自動將當前時間記錄下來,後期若是你不人爲修改的話,數據不變
queryset:只要是queryset對象就能夠無限的點queryset對象的方法
eg:一步步篩選
queryset.excult(pk=1).filter(pk=3).filter(pk=4)
return:return返回的必須是字符串,其餘的類型直接報錯,此處能夠寫在models.py中。
書籍對象查出版社 外鍵字段在書籍 正向查詢
出版社查書籍 外鍵字段在書籍 反向查詢
注意:計算機語言是基於英語語境開發的語言,因此能夠用英語的語法角度出發理解,沒必要太中式思考。不管是正向仍是反向查詢,只須要按着你想查找的結果爲最終目的去運用命令,能夠輕鬆理解查詢這一塊的知識。