zoukankan      html  css  js  c++  java
  • $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)
        二.分组查询:以谁group by 就以谁为基表
        # 查询名字叫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代表,不做外键关联
  • 相关阅读:
    Java中使用Jedis操作Redis
    Predicate与filter
    Joiner的用法
    Immutable集合
    【Excle数据透视】如何在数据透视表字段列表中显示更多的字段
    【Excle数据透视表】如何显示/隐藏数据透视表字段列表
    【Excle数据透视】如何创建多条件汇总的数据透视表
    【Excle数据透视表】如何创建非共享缓存的数据透视表
    【Excle数据透透视表】如何删除数据透视表
    【Excle数据透视表】如何复制数据透视表
  • 原文地址:https://www.cnblogs.com/3sss-ss-s/p/9960192.html
Copyright © 2011-2022 走看看