Django基礎之模型層(下)

聚合查詢

關鍵字:aggregatepython

from django.db.models import  Max,Min,Sum,Count,Avg

統計全部書的平均價格mysql

models.Book.objects.all().aggregate(Avg('price'))  #拿全部的書籍的價格的平均值

這樣的話就能夠求最大的價格,最小的價格等git

分組查詢

關鍵字:annotate面試

統計每一本書的做者個數sql

models.Book.objects.annotate(author_num = Count('author')).values('title')

統計每個出版社賣的最便宜的書的價格數據庫

models.Book.objects.annotate(price_min=Min('book__price')).values('price_min')

統計不止一個做者的圖書django

models.Book.objects.annotate(author_num = Count('author')).values('author_num').filter(author__num__gt=1)

查詢各個做者出的書的總價格app

models.Author.objects.annotate(sum_price = Sum('book__price')).values('sum_price')

F與Q查詢

F查詢

查詢賣出數大於庫存數fetch

models.Book.objects.filter(maichu__gt=F('kucun'))

將全部的書的價格所有提升100元優化

models.Book.objects.update(price=F('price')+ 100)

將全部書的名字後面都加上爆款

from django.db.models.functions import Concat
from django.db.models import Value
ret3=models.Product.objects.update(name=Concat(F('name'),Value('爆款')))

Q查詢

查詢書籍名稱是python入門或者價格是54的書

models.Book.objects.filter(Q(title='python入門')|Q(price=54))

查詢書籍名稱不是python入門或者價格是54的書

models.Book.objects.filter(~Q(title='python入門')|Q(price=54))

Q查詢進階

查詢條件由用戶輸入決定

q = Q()
q.connector = 'or'   #將默認and,改成or
q.children.append(('title','python'))
q.children.append(('kucun',666))
res = models.Book.objects.filter(q)

字符串左邊跟變量名書寫的格式如出一轍

ORM中常見字段

ORM字段與MySQL字段對應關係

'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)',

自定義char字段

class MyCharField(models.Field):
            def __init__(self,max_length,*args,**kwargs):
                self.max_length = max_length
                super().__init__(max_length=max_length,*args,**kwargs)

            def db_type(self, connection):
                return 'char(%s)'%self.max_length

查詢優化(面試)

only與defer

only會將口號內的字段對應的值 直接封裝到返回給你的對象中 點該字段 不須要再走數據庫

一旦你點了不在括號內的字段 就會頻繁的去走數據庫查詢

deferonly互爲反關係defer會將括號內的字段排除以外,將其餘字段對應的值 直接封裝到返回給你的對象中,點該其餘字段 不須要再走數據庫,一旦你點了在括號內的字段 就會頻繁的去走數據庫查詢

select_related會自動幫你作連表操做,而後連表以後的數據所有查詢出來封裝給對象

select_related括號內只能放外鍵字段,而且多對多字段除外

若是括號內所關聯的外鍵字段還有外鍵字段,還能夠繼續連表

select_related(外鍵字段__外鍵字段__外鍵字段...)

prefetch_relate看似是連表操做,實際上是子查詢,內部不作連表,小號的資源就在查詢次數上,可是給用戶感受不出來

Django ORM中的事務操做

ACID:原子性、一致性、隔離性、持久性

from django.db import transaction
with transaction.atomic():
    #在該代碼塊中所寫的orm語句 同屬於一個事務
#縮進出來以後自動結束

補充知識:

django2.x版本:在建數據庫關係的時候須要手動指定2個參數,要告訴django級聯更新,級聯刪除,是否創建外鍵約束

on_delete,db_constraint

圖片轉自:https://www.cnblogs.com/Dominic-Ji/

相關文章
相關標籤/搜索