關鍵字:aggregate
python
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')
查詢賣出數大於庫存數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('爆款')))
查詢書籍名稱是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.connector = 'or' #將默認and,改成or q.children.append(('title','python')) q.children.append(('kucun',666)) res = models.Book.objects.filter(q)
字符串左邊跟變量名書寫的格式如出一轍
'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)',
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
互爲反關係,defer
會將括號內的字段排除以外,將其餘字段對應的值 直接封裝到返回給你的對象中,點該其餘字段 不須要再走數據庫,一旦你點了在括號內的字段 就會頻繁的去走數據庫查詢
select_related
會自動幫你作連表操做,而後連表以後的數據所有查詢出來封裝給對象
select_related
括號內只能放外鍵字段,而且多對多字段除外
若是括號內所關聯的外鍵字段還有外鍵字段,還能夠繼續連表
select_related(外鍵字段__外鍵字段__外鍵字段...)
prefetch_relate
看似是連表操做,實際上是子查詢,內部不作連表,小號的資源就在查詢次數上,可是給用戶感受不出來
ACID:原子性、一致性、隔離性、持久性
from django.db import transaction with transaction.atomic(): #在該代碼塊中所寫的orm語句 同屬於一個事務 #縮進出來以後自動結束
django2.x版本:在建數據庫關係的時候須要手動指定2個參數,要告訴django級聯更新,級聯刪除,是否創建外鍵約束
on_delete
,db_constraint