美文网首页
Django 六

Django 六

作者: 吃可爱长大鸭 | 来源:发表于2021-08-04 18:46 被阅读0次

    目录

    1.扩展
    2.Djago admin使用
    3.Django 测试环境
    4.Django查看原生sql
    5.Django 聚合查询
    6.Django F查询
    7.Django Q查询
    8.Django 分组查询
    

    1.扩展

    1. 普通函数以__开头
        -说明当前函数只在当前模块(py)下使用,尽量不在外部调用
        
    2. mysql
        -utf8:2个字节表示一个字符
        -utf8mb4:等同于真正意义上的utf-8
        -utf-8:1--4个字节,表示一个字符
        
    3. django 的orm使用pymysql连接mysql
        -需要加这一句话(本质就是猴子补丁的应用)
            import pymysql
            pymysql.install_as_MySQLdb()
       -本质是想让它执行,放在哪都可以
            -init中
            -settings.py中
    

    2.Djago admin使用

    1. 后台管理,方便我们快速的录入书籍
    2. 使用方法:
    第一步:在admin.py 中把要使用的表注册
    from app01 import models
          admin.site.register(models.Book)
          admin.site.register(models.Publish)
          admin.site.register(models.Author)
          admin.site.register(models.AuthorDetail)
    
    第二步:创建个超级管理员
          python3 manage.py createsuperuser 
                输入用户名,输入密码
    
    第三步:登录
         http://127.0.0.1:8000/admin/
    

    3.Django 测试环境

    # tests.py
    
    import os
    #加载配置文件,跑django的项目,最开始就是把配置文件加载上
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "skyy.settings")
    
    if __name__ == '__main__':
        import django  # 安装了django模块,就可以import
        django.setup() # 使用环境变量中的配置文件,跑django
    
        from app01 import models
    

    4.Django查看原生sql

    1. queryset对象.query
    2. 通过日志,如下,配置到setting.py中
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
    

    5.Django 聚合查询

    # tests.py
    from django.db.models import Sum,Avg,Max,Min,Count
    # 计算所有图书的平均价格
    Countres=models.Book.objects.all().aggregate(Avg('price'))
    print(res)
    # 计算所有图书的最高价格
    res=models.Book.objects.all().aggregate(Max('price'))
    print(res)
    # 计算所有图书的总价格
    res=models.Book.objects.all().aggregate(Sum('price'))
    print(res)
    # 计算所有图书的总价格
    res=models.Book.objects.all().aggregate(book_sum=Sum('price'),book_avg=Avg('price'))
    print(res)
    # 测试出版图书的总价格
    res = models.Book.objects.filter(authors__name='测试').values('publish__book').aggregate(Sum('price'))
    print(res)
    # 北京出版社书的最高价格
    res1 = models.Publish.objects.filter(name='北京出版社').values('book').aggregate(Max('book__price'))
    print(res1)
    

    6.Django F查询

    # tests.py
    # F 查询,取出某个字段对应的值
    from django.db.models import F
    #查询评论数大于阅读数的书籍
    res=models.Book.objects.filter(commit_num__gt=F('read_num'))
    print(res)
    
    # 把所有图书价格+1
    res=models.Book.objects.all().update(price=F('price')+1)
    print(res) # 影响额行数
    

    7.Django Q查询

    # Q查询:构造出与&    或|   ^非~
    from django.db.models import Q
    
    # 查询名字叫红楼梦或者价格大于100的书
    res=models.Book.objects.filter(name='红楼梦',price__gt=100)
    res=models.Book.objects.filter(Q(name='红楼梦')|Q(price__gt=100))
    res=models.Book.objects.filter(Q(name='红楼梦')& Q(price__gt=100))
    
    # 查询名字不是红楼梦的书
    
    res=models.Book.objects.filter(~Q(name='红楼梦'))
    #查询名字不是红楼梦,并且价格大于100的书
    res = models.Book.objects.filter(~Q(name='红楼梦'),price__gt='100')
    res = models.Book.objects.filter(~Q(name='红楼梦')&Q(price__gt='100'))
    print(res)
    

    8.Django 分组查询

    import os
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
    if __name__ == '__main__':
        import django
        django.setup()
        from app01 import models
        # 查询每一个出版社id,以及出书平均价格(单表)
        # 原生sql
        # select publish_id,avg(price) from book group by publish_id;
        # orm实现
        '''
        把同一类归为一组,然后使用聚合函数操作
        如果是多表,把连个表连起来,再分组,再聚合
        取的字段必须是分组字段或者聚合函数的字段
        标准 annotate() 内写聚合函数
        values在前,表示group by 的字段
        values在后,表示取字段
        filter在前,表示where条件
        filter在后,表示having
        '''
    from django.db.models import Avg,Count,Max
    
    res = models.Book.objects.all().\
    values('publish_id').\
    annotate(price_ave=Avg('price')).values('publish_id','price_ave')
    print(res)
    
    # 查询出版社id大于1的出版社id,以及出书平均价格
    res=models.Book.objects.values('publish_id').filter(publish_id__gt=1).annotate(price_ave=Avg('price')).values('publish_id','price_ave')
    print(res)
    
    # 查询出版社id大于1的出版社id,以及出书平均价格大于30的
    res=models.Book.objects.values('publish_id').filter(publish_id__gt=1).annotate(price_ave=Avg('price')).filter(price_ave__gt=60).values('publish_id','price_ave')
    print(res)
    
    #查询每一个出版社出版的名称和书籍个数(连表)
    # 联表的话最好以group by的表作为基表
    res=models.Publish.objects.values('nid').annotate(book_count=Count('book__nid')).values('name','book_count')
    # 简写成,如果基表是group by的表,就可以不写values
    res=models.Publish.objects.annotate(book_count=Count('book')).values('name','book_count')
    
    # 以book为基表
    res=models.Book.objects.values('publish__nid').annotate(book_count=Count('nid')).values('publish__name','book_count')
    print(res)
    
    #查询每个作者的名字,以及出版过书籍的最高价格(建议使用分组的表作为基表)
    # 多对多如果不以分组表作为基表,可能会出数据问题
    res=models.Author.objects.annotate(price_max=Max('book__price')).values('name','price_max')
    res=models.Book.objects.values('authors__nid').annotate(price_max=Max('price')).values('authors__name','price_max')
    print(res)
    
    #查询每一个书籍的名称,以及对应的作者个数
    res=models.Book.objects.annotate(count=Count('authors')).values('name','count')
    print(res)
    
    ##统计不止一个作者的图书
    ## 统计价格数大于10元,作者的图书
    ##统计价格数大于10元,作者个数大于1的图书   
    res=models.Book.objects.filter(price__gt=10).annotate(count=Count('authors')).filter(count__gt=1).values('name','price','count')
    print(res)
    

    相关文章

      网友评论

          本文标题:Django 六

          本文链接:https://www.haomeiwen.com/subject/ozquvltx.html