$Django 聚合函式、分組查詢、F,Q查詢、orm欄位以及引數
阿新 • • 發佈:2018-11-14
一.聚合函式
from django.db.models import Avg,Sum,Max,Min,Count,F,Q #匯入
# .查詢圖書的總價,平均價,最大價,最小价
# ret=Books.objects. aggregate(Avg('price'),Min('price'),Max('price'),Sum('price'))
# print(ret)
二.分組查詢
# 查詢名字叫lqz作者書的總價格
# Zuozhe.objects.filter(name='lqz').annotate(c=Sum('books__price')).values('name','c')
# 查詢所有作者寫的書的總價格大於30
# Zuozhe.objects. annotate(c=Sum('books__price')).filter(c__gt=30).values('name','c') # Zuozhe.objects.values('pk').annotate(c=Sum('books__price')).filter(c__gt=30).values('name','c') 終極總結:
values在前,表示group by,在後,表示取值(預設pk/id 省略) filter在前,表示過濾(where),在後,表示having(對分組之後的結果再進行過濾)
三.F,Q(與& ,或 | ,非 ~)查詢
# 查詢評論數大於閱讀數的書籍名
# ret=Books.objects. filter(p__gt=F('r')).values('name')
# print(ret)
# 把python這本書的閱讀數減5
# Books.objects.filter(name='python'). update(r=F('r')-5)
# a.查詢作者名字是lqz或者名字是egon的書
# Books.objects .filter(Q(name='lqz')|Q(name='egon'))
# b.查詢作者不是lqz的書
# Books.objects. filter(~Q(name='lqz'))
# Books.objects. exclude(name='lqz')
# c.構建很複雜的邏輯,需要用括號來區分
# 查詢名字為紅樓夢或者價格大於20並且id大於2的書籍
r1=Books.objects. filter((Q(name='紅樓夢')|Q(price__gt=20))&Q(pk__gt=2) ).values('name')
r2=Books.objects. filter((Q(name='紅樓夢')|Q(price__gt=20)),pk__gt=2 ).values('name')
r3=Books.objects. filter((Q(name='紅樓夢')|Q(price__gt=20)),Q(pk__gt=2) ).values('name')
print(r1)
print(r2)
print(r3) 四.欄位型別,欄位引數
#常用欄位:必須記住,非常用欄位,瞭解即可 https://www.cnblogs.com/liuqingzheng/articles/9627915.html
# 欄位
常用
AutoField
IntegerField
CharField
DateField
DateTimeField
TextField
EmailField
FilePathField
FileField
ImageField '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)',
#欄位引數
orm通用欄位引數:
-null 可以為空
-unique 唯一性約束
-default 預設值
-db_index 為該欄位建索引
-只給日期型別和時間型別用
-auto_now_add 新增資料時,預設把當前時間存入
-auto_now 修改的時候,預設把當前時間存入
關係欄位
ForeignKey
-to 關聯哪個表
-to_field 關聯的欄位
-related_name 反向操作時,使用的欄位名,用於代替原反向查詢時的'表名_set'。(一般不要用)
-related_query_name :基於雙下劃線的反向查詢之前按表名小寫(一般不要用)
-on_delete:models.CASCADE,models.SET_NULL
-db_constraint:db_constraint=False代表,不做外來鍵關聯
from django.db.models import Avg,Sum,Max,Min,Count,F,Q #匯入
# .查詢圖書的總價,平均價,最大價,最小价
# ret=Books.objects. aggregate(Avg('price'),Min('price'),Max('price'),Sum('price'))
# print(ret)
二.分組查詢
# 查詢名字叫lqz作者書的總價格
# Zuozhe.objects.filter(name='lqz').annotate(c=Sum('books__price')).values('name','c')
# 查詢所有作者寫的書的總價格大於30
# Zuozhe.objects. annotate(c=Sum('books__price')).filter(c__gt=30).values('name','c') # Zuozhe.objects.values('pk').annotate(c=Sum('books__price')).filter(c__gt=30).values('name','c') 終極總結:
values在前,表示group by,在後,表示取值(預設pk/id 省略) filter在前,表示過濾(where),在後,表示having(對分組之後的結果再進行過濾)
三.F,Q(與& ,或 | ,非 ~)查詢
# 查詢評論數大於閱讀數的書籍名
# ret=Books.objects. filter(p__gt=F('r')).values('name')
# print(ret)
# 把python這本書的閱讀數減5
# Books.objects.filter(name='python'). update(r=F('r')-5)
# a.查詢作者名字是lqz或者名字是egon的書
# Books.objects .filter(Q(name='lqz')|Q(name='egon'))
# b.查詢作者不是lqz的書
# Books.objects. filter(~Q(name='lqz'))
# Books.objects. exclude(name='lqz')
# c.構建很複雜的邏輯,需要用括號來區分
# 查詢名字為紅樓夢或者價格大於20並且id大於2的書籍
r1=Books.objects. filter((Q(name='紅樓夢')|Q(price__gt=20))&Q(pk__gt=2) ).values('name')
r2=Books.objects. filter((Q(name='紅樓夢')|Q(price__gt=20)),pk__gt=2 ).values('name')
r3=Books.objects. filter((Q(name='紅樓夢')|Q(price__gt=20)),Q(pk__gt=2) ).values('name')
print(r1)
print(r2)
print(r3) 四.欄位型別,欄位引數
#常用欄位:必須記住,非常用欄位,瞭解即可 https://www.cnblogs.com/liuqingzheng/articles/9627915.html
# 欄位
常用
AutoField
IntegerField
CharField
DateField
DateTimeField
TextField
EmailField
FilePathField
FileField
ImageField '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)',
#欄位引數
orm通用欄位引數:
-null 可以為空
-unique 唯一性約束
-default 預設值
-db_index 為該欄位建索引
-只給日期型別和時間型別用
-auto_now_add 新增資料時,預設把當前時間存入
-auto_now 修改的時候,預設把當前時間存入
關係欄位
ForeignKey
-to 關聯哪個表
-to_field 關聯的欄位
-related_name 反向操作時,使用的欄位名,用於代替原反向查詢時的'表名_set'。(一般不要用)
-related_query_name :基於雙下劃線的反向查詢之前按表名小寫(一般不要用)
-on_delete:models.CASCADE,models.SET_NULL
-db_constraint:db_constraint=False代表,不做外來鍵關聯