一庙洼、前后端分離和混合開發(fā)
1、模板語言:每個語言的web框架都會有模板語言镊辕,例django template language ==> dtl
2油够、模板語言的渲染是在后端完成的
3、用php寫前端是不對的征懈,前端只能是html石咬、css、js
4卖哎、前后端分離:前后端交互鬼悠,統(tǒng)一全用json格式
5、前端只專注于寫前端(vue亏娜、react:前端工程化)焕窝,后端只專注于寫后端(提供接口,交互json格式數據)
二维贺、聚合查詢
#聚合函數:最大它掂、最小、和幸缕、平均群发、總個數
from django.db.models import Max,Min,Sum,Avg,Count
#aggregate(*args, **kwargs),aggregate結束,已經不是queryset對象
#計算最大價格圖書
book = models.Book.objects.all().aggregate(max=Max("price"))
三发乔、分組查詢
annotate()為調用的QuerySet中每一個對象都生成一個獨立的統(tǒng)計值(統(tǒng)計方法用聚合函數)熟妓。
#統(tǒng)計價格數大于10元,作者個數大于1的圖書
res = models.Book.objects.values("pk").filter(price__gt=10).annotate(count=Count("authors__id")).filter(count__gt=1).values("name","count")
...
第一個values:分組
第一個filter:相當于where
第二個filter:相當于having
第二個values:查詢栏尚,取值
四起愈、F和Q查詢
F查詢:取出數據庫的某個字段的值
from django.db.models import F
# 把read_num都加1
res = models.Book.objects.all().update(read_num=F("read_num") + 1)
#查詢評論數大于閱讀數的書籍
res = models.Book.objects.all().filter(commit_num__gt=F("read_num"))
for i in res:
print(i.name)
Q查詢:制造與或非的條件
from django.db.models import Q
# 查詢名字叫egon或者價格大于100的書
res = models.Book.objects.filter(Q(name="egon") | Q(price__gt=100))
# 查詢名字叫egon并且價格大于100的書
方式一:res = models.Book.objects.filter(Q(name="egon") & Q(price__gt=100))
方式二:res = models.Book.objects.filter(name="egon",price__dt=100)
# 查詢名字不為egon的書
res = models.Book.objects.filter(~Q(name="egon"))
Q可以嵌套
#查詢名字叫egon并且價格大于100的或者是id小于3的書、
res = models.Book.onbjects.filter((Q(name="egon") & Q(price__gt=100)) | Q(id__lt=3))
五译仗、原生sql
#第一種方案
from django.db import connection
cursor = connection.cursor()
cursor.execute("select * from app01_book where id = %s",[1])
res = cursor.fetchall()
print(res)
#第二種方案
books = models.Book.objects.raw("select * from app01_book where id > 3")
print(books) # RawQuerySet對象
for book in books:
print(book.name)
六抬虽、defer和only
defer 和 only(跟查詢優(yōu)化相關)
only:保持是book對象,sql語句中只能搜索到only指定的字段纵菌,若要點其他字段阐污,sql會再搜索一遍該字段,影響查詢速度
defer:除了該字段sql都會搜索出咱圆。
books = models .Book.objects.all().only("name")
print(books[0].name)
print(books[0].price) # 能出來笛辟,會影響sql查詢優(yōu)化
books = models.Book.objects.all().defer("name","price")
print(books[0].__dict__) # 除了name和price字段
七功氨、事務(請求、裝飾器手幢、局部)
django orm中使用事物:原子性操作捷凄,要么都成功,要么都失敗
事物的三個粒度
1围来、局部使用
from django.db import transaction
with transaction.atomic(): # 規(guī)定都在事務中
author_detail = modes.AuthorDetail.objects.create(addr="xxx",phone="123",sex=1)
raise Exception("拋了異常") #主動拋出異常跺涤,兩條數據都錄不進去,若取消異常监透,就都成功
author = models.Author.objects.create(name="lqz",age=19,author_detail=author_detail)
2桶错、視圖函數裝飾器,這一個視圖函數都在一個事物中
@transaction.atomic
def index(request):
return HttpResponse("OK")
3才漆、整個http請求牛曹,在事務中佛点。需要在settings.py中配置
'''
DATABASES = {
'default': {
...
'PORT': 3306,
'ATOMIC_REQUEST': True,
}
}
'ATOMIC_REQUEST': True,
設置為True統(tǒng)一個http請求對應的所有sql都放在一個事務中執(zhí)行(要么所有都成功醇滥,要么所有都失敗)超营。
'''