Django 六

2021-08-04  本文已影响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)
上一篇下一篇

猜你喜欢

热点阅读