day73

今日内容:
 
 1基于双下划线的跨表查询
    套路一样,用__跨表
      -一对多
      -多对多
    # 北京出版社出版的所有图书
    res = models.Publish.objects.filter(name='北京出版社').values('book__name')
    print(res)
    # 三国演义的所有作者
    res = models.Book.objects.filter(name='三国演义').values('authors__name')
    print(res)
  # 跨表改
  # 将lay出版的所有书的出版社的邮箱改为987@qq.com
  # models.Publish.objects.filter(book__authors__name='lay').update(email='987@qq.com')
 2 聚合查询
    -聚合函数
       from django.db.models import Avg,Count,Max,Min,Sum
       # 计算所有图书的平均价格
 
    from django.db.models import Max,Min,Count,Sum,Avg
    # 所有图书的总价
    res = models.Book.objects.all().aggregate(s=Sum('price'))
    print(res)
    # 红楼梦的有多少个作者
    res = models.Book.objects.filter(name='红楼梦').aggregate(c=Count('authors'))
    print(res)
    # 郑棒写的最贵的书
    res = models.Author.objects.filter(name='郑棒').aggregate(m=Max('book__price'))
    print(res)
    # 郑棒出版社出版的最便宜的价格
    res = models.Publish.objects.filter(name='郑棒出版社').aggregate(m=Min('book__price'))
    print(res)

 3分组查询
    # 分组查询
    # 查询所有出版社的多少书
    # res = models.Publish.objects.all().annotate(c=Count('book__name')).values('name','c')
    # print(res)
    # 统计每一本书作者个数
    # res = models.Book.objects.all().annotate(c=Count('authors')).values('name', 'c')
    # print(res)
    # 统计每一个出版社的最便宜的书
    # res = models.Publish.objects.annotate(m=Min('book__price')).values('name', 'm')
    # print(res)
    # 统计每一本以py开头的书籍的作者个数
    # res = models.Book.objects.filter(name__startswith='py').annotate(c=Count('authors')).values('name', 'c')
    # print(res)
    # 查询各个作者出的书的总价格
    # res = models.Author.objects.all().annotate(s=Sum('book__price')).values('name', 's')
    # print(res)
    终极总结:
       values在前,表示group by,在后,表示取值
       filter在前,表示过滤(where),在后,表示having(对分组之后的结果再进行过滤)
 4 F查询与Q查询
    -F为了字段=后面的值,不能放字段,所以用F函数包裹一下就可以了
    -Q为了构造与&,或|,非~的关系
  
from django.db.models import F, Q
# 查询阅读数大于评论数的图书
res = models.Book.objects.filter(read__gt=F('commit'))
print(res)
# 把所有书的评论数加1
res = models.Book.objects.update(commit=F('commit') + 1)
# 把python这本书的阅读数减5
res = models.Book.objects.filter(name__startswith='py').update(read=F('read') - 5)
# Q函数表示与&,或|,非~
# 查询作者名字不是郑棒或者名字不是徐都会的书
res = models.Book.objects.exclude(Q(authors__name='郑棒')|Q(authors__name='徐都会'))
print(res)
# 查询北京出版社出版的书籍的作者的电话号码,如果电话号码13开头的将作者地址改为北京
res = models.Author.objects.filter(Q(author_details__phone__startswith='13') & Q(book__publish__name='北京出版社')).update(addr='北京')
print(res)

 5 常用字段:必须记住,非常用字段,了解即可
 6 orm字段参数:
    -null  可以为空
    -unique  唯一性约束
    -default 默认值
    -db_index 为该字段建索引
    -只给日期类型和时间类型用
     -auto_now_add    新增数据时,默认把当前时间存入
     -auto_now        修改的时候,默认把当前时间存入
 7 关系字段
    ForeignKey
       -to  关联哪个表
       -to_field 关联的字段
       -related_name 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。(一般不要用)
       -related_query_name :基于双下划线的反向查询之前按表名小写(一般不要用)
       -on_delete:models.CASCADE,models.SET_NULL
       -db_constraint:db_constraint=False代表,不做外键关联

转载于:https://www.cnblogs.com/yaoxiaofeng/p/9960258.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值