1. 程式人生 > >$Django 聚合函式、分組查詢、F,Q查詢、orm欄位以及引數

$Django 聚合函式、分組查詢、F,Q查詢、orm欄位以及引數

    一.聚合函式
    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代表,不做外來鍵關聯