• 做题


    from django.shortcuts import render,HttpResponse
    from Af_Pr import models
    from django.db.models import Avg,Max,Min,Count,Sum
    from django.db.models import F,Q

    def query(request):
    # book_obj = models.Book.objects.filter(id=1)[0]
    # book_obj.authors.add(1,2)
    book_obj1 = models.Book.objects.filter(id=3)[0]
    book_obj1.authors.add(2)

    链表操作 用属性

    # print(models.Book.objects.filter(id=2),models.Book.objects.filter(id=2).values())   #<QuerySet [<Book: 小王子>]> <QuerySet [{'id': 2, 'title': '小王子', 'price': Decimal('44.00'), 'zan': 32, 'comment': 22, 'publishs_id': 2}]>
    # print(models.Book.objects.filter(id=2).values('title'))     #<QuerySet [{'title': '小王子'}]>
    # print(models.Book.objects.filter(id=2).values_list('title'))    #<QuerySet [('小王子',)]>
    # author_obj = models.Author.objects.filter(name='李继宏')[0]
    # print(models.Author.objects.filter(name='李继宏'),models.Author.objects.filter(name='李继宏')[0])   #<QuerySet [<Author: 李继宏   李继宏
    # print(models.Book.objects.filter(id=2)[0].authors.remove(author_obj))   # 可以根据这个作者名字删除,不是作者对象
    # print(models.Book.objects.filter(id=2).values('title').filter(id=2))    #<QuerySet [{'title': '小王子'}]>
    # print(models.Book.objects.values())     #<QuerySet [{'id': 1, 'title': '飞鸟集', 'price': Decimal('23.00'), 'zan': 33, 'comment': 45, 'publishs_id': 1}, {'id': 2, 'title': '小王子', 'price': Decimal('44.00'), 'zan': 32, 'comment': 22, 'publishs_id': 2}, {'id': 3, 'title': '边城', 'price': Decimal('12.00'), 'zan': 3, 'comment': 222, 'publishs_id': 3}]>
    # print(models.Book.objects.values('title'))      #<QuerySet [{'title': '飞鸟集'}, {'title': '小王子'}, {'title': '边城'}]>
    
    # print(models.Book.objects.values('title').annotate(Avg('')))
    
    # obj = models.Book.objects.filter(authors__name='李继宏').values('title', 'authors__book__authors')
    # print(obj)    # 查看的是作者写的那本书的所有作者    #<QuerySet [{'title': '飞鸟集', 'authors__book__authors': 1}, {'title': '飞鸟集', 'authors__book__authors': 2}, {'title': '飞鸟集', 'authors__book__authors': 2}, {'title': '边城', 'authors__book__authors': 1}, {'title': '边城', 'authors__book__authors': 2}, {'title': '边城', 'authors__book__authors': 2}]>
    # print(models.Book.objects.filter(authors__name='李继宏').values('title','authors'))    #<QuerySet [{'title': '飞鸟集', 'authors': 2}, {'title': '边城', 'authors': 2}]>
    # print(models.Book.objects.filter(authors__name='李继宏'))  # <QuerySet [<Book: 飞鸟集>, <Book: 边城>]>
    

    下午

    # 一对多查询 正向查询(用属性)    查询 出版社 译林出版过的所有书籍的名字与价格
    print(models.Book.objects.filter(publishs__name='译林').values_list('title','price'))    # <QuerySet [('飞鸟集', Decimal('23.00'))]>
    #反向查询
    print(models.Publish.objects.filter(name='译林').values_list('bp1__title','bp1__price'))
    #查询 书籍的出版社的名字
    print(models.Book.objects.filter(title='小王子').values_list('publishs__name'))    #<QuerySet [('人民邮电',)]>
    #多对多查询
    #正向  查询作者 李继宏 写作的所有书籍的名字
    print(models.Author.objects.filter(name='泰戈尔').values_list('book__title'))  #<QuerySet [('飞鸟集',), ('小王子',)]>
    # 反向  查询书籍 飞鸟集 的所有作者的电话
    print(models.Book.objects.filter(title='飞鸟集').values_list('authors__ad_id__telephone')) #<QuerySet [('123',), ('333',)]>
    
    # 连续跨表
    # 正向查询 出版社 译林的所有书籍的名字以及作者的名字
    # values_list 格式都是 :  #<QuerySet [('飞鸟集', '泰戈尔'), ('飞鸟集', '李继宏')]>
    print(models.Publish.objects.filter(name='译林').values('bp1__title','bp1__authors__name'))   #<QuerySet [{'bp1__title': '飞鸟集', 'bp1__authors__name': '泰戈尔'}, {'bp1__title': '飞鸟集', 'bp1__authors__name': '李继宏'}]>
    # 反向查询
    print(models.Book.objects.filter(publishs__name='译林').values('title','authors__name')) #    <QuerySet [{'title': '飞鸟集', 'authors__name': '泰戈尔'}, {'title': '飞鸟集', 'authors__name': '李继宏'}]>
    
    # 练习 :手机号以151 开头的作者 出版过的所有书籍名称 以及出版社名称
    print(models.AuthorDetail.objects.filter(telephone__startswith=123).values('author__book__title','author__book__publishs__name'))   #<QuerySet [{'author__book__title': '飞鸟集', 'author__book__publishs__name': '译林'}, {'author__book__title': '边城', 'author__book__publishs__name': '新华书店'}]>
    print(models.Author.objects.filter(ad_id__telephone__startswith=123).values('book__title','book__publishs__name'))
    
    # related_name      publishs = ForeignKey(to='Publish' related_name='bp1')
    
    
    # 聚合查询  #计算所有图书的平均价格
    # aggregate调用
    # models.Book.objects.aggregate(Avg('price')  也可以
    print(models.Book.objects.all().aggregate(Avg('price')))    #{'price__avg': 26.333333}
    print(models.Book.objects.aggregate(average_price=Avg('price')))    #{'average_price': 26.333333}
    print(models.Book.objects.aggregate(Avg('price'),Max('price'),Min('price')))    #{'price__avg': 26.333333, 'price__max': Decimal('44.00'), 'price__min': Decimal('12.00')}
    
    
    #  单表分组查询           value 分组条件    annotate  结果
    print(models.Book.objects.values('title').annotate(c= Count('price')))  #<QuerySet [{'title': '飞鸟集', 'c': 1}, {'title': '小王子', 'c': 1}, {'title': '边城', 'c': 1}]>
    # print(models.Book.objects.values('title').annotate(c= 'authors__name'))
    # 查询 每一个部门名称以及对应的员工数
    print(models.Author.objects.values('name').annotate(c = Count('book__title')))  #<QuerySet [{'name': '泰戈尔', 'c': 2}, {'name': '李继宏', 'c': 2}, {'name': '安东尼', 'c': 0}]>
    print(models.Author.objects.values('name').annotate(c=Count( 'book__title')).values('name'))         #<QuerySet [{'name': '泰戈尔'}, {'name': '李继宏'}, {'name': '安东尼'}]>
    print(models.Author.objects.values('name','age').annotate(c=Count('book__title')))  #<QuerySet [{'name': '泰戈尔', 'age': 78, 'c': 2}, {'name': '李继宏', 'age': 39, 'c': 2}, {'name': '安东尼', 'age': 56, 'c': 0}]>
    
    
    # 查询练习  1 统计每一个出版社最便宜的书
    print(models.Publish.objects.values('name','bp1__title').annotate(c=Min('bp1__price')))
    #<QuerySet [{'name': '译林', 'bp1__title': '飞鸟集', 'c': Decimal('23.00')}, {'name': '人民邮电', 'bp1__title': '小王子', 'c': Decimal('44.00')}, {'name': '新华书店', 'bp1__title': '边城', 'c': Decimal('12.00')}]>
    
    #2 练习:统计每一本书的作者个数
    print(models.Book.objects.values('title').annotate(c = Count('authors__id')))   #<QuerySet [{'title': '飞鸟集', 'c': 2}, {'title': '小王子', 'c': 1}, {'title': '边城', 'c': 1}]>
    #(3) 统计每一本以py开头的书籍的作者个数:
    print(models.Book.objects.filter(title__startswith='小').values('title').annotate(c = Count('authors__id'))) #<QuerySet [{'title': '小王子', 'c': 1}]>
    
    #  (4) 统计不止一个作者的图书:
    print(models.Book.objects.values('title').annotate(c=Count('authors__id')).filter(c__gt=0).values('title','c'))
        #<QuerySet [{'title': '飞鸟集', 'c': 2}, {'title': '小王子', 'c': 1}, {'title': '边城', 'c': 1}]>
    #(5) 根据一本图书作者数量的多少对查询集 QuerySet进行排序:
    print(models.Book.objects.values('title').annotate(c= Count('authors__id')).order_by('-c'))    #<QuerySet [{'title': '边城', 'c': 3}, {'title': '飞鸟集', 'c': 2}, {'title': '小王子', 'c': 1}]>
    
    #  (6) 查询各个作者出的书的总价格:
    print(models.Author.objects.values('name').annotate(Sum('book__price')))
            #<QuerySet [{'name': '泰戈尔', 'book__price__sum': Decimal('79.00')}, {'name': '李继宏', 'book__price__sum': Decimal('35.00')}, {'name': '安东尼', 'book__price__sum': Decimal('12.00')}]>
    

    F和Q查询

    F查询

    ## 查询评论数大于收藏数的书籍
    print(models.Book.objects.filter(comment__lt= F('zan')))    #<QuerySet [<Book: 小王子>]>
    #查询评论数大于收藏数2倍的书籍
    print(models.Book.objects.filter(comment__gt=F('zan')*2))   #<QuerySet [<Book: 边城>]>
    # 把所有的书籍价格 增加30
    # models.Book.objects.all().update(price=F('price')+30)
    

    Q 查询 &与 |或 ~非

    print(models.Book.objects.filter(Q(authors__name__startswith="李") | Q(authors__name__startswith="泰")).values('title'))
    a = models.Book.objects.filter(Q(authors__name__startswith="李") | Q(authors__name__startswith="泰")).values('title')
    # print(a.annotate(c = Max('price')))
    
    print(models.Book.objects.filter(Q(authors__name='泰戈尔') | Q(title='飞鸟集'), price__gt = 220 ))
    
    # 综合练习题
    #1 查询每个作者的姓名以及出版的书的最高价格
    print(models.Author.objects.values('name').annotate(c = Max('book__price')))    #<QuerySet [{'name': '泰戈尔', 'c': Decimal('224.00')}, {'name': '李继宏', 'c': Decimal('203.00')}, {'name': '安东尼', 'c': Decimal('192.00')}]>
    
    
    # 2 查询作者id大于2作者的姓名以及出版的书的最高价格
    print(models.Author.objects.filter(id__gt=2).values('name').annotate(c = Max('book__price')))   #<QuerySet [{'name': '安东尼', 'c': Decimal('192.00')}]>
    
    # 3 查询作者id大于2或者作者年龄大于等于20岁的女作者的姓名以及出版的书的最高价格
    print(models.Author.objects.filter(Q(id__gt=2) | Q(age__gte=30),name__startswith='李').values('name').annotate(c = Max('book__price')))
                                                                                              #<QuerySet [{'name': '李继宏', 'c': Decimal('203.00')}]>
    #4 查询每个作者出版的书的最高价格 的平均值
    print(models.Author.objects.values('name'))     #<QuerySet [{'name': '泰戈尔'}, {'name': '李继宏'}, {'name': '安东尼'}]>
    a = models.Author.objects.values('name').annotate(c = Max('book__price'))   #<QuerySet [{'name': '泰戈尔', 'c': Decimal('224.00')}, {'name': '李继宏', 'c': Decimal('203.00')}, {'name': '安东尼', 'c': Decimal('192.00')}]>
    print(models.Author.objects.values('name').annotate(c=Max('book__price')).aggregate(Avg('c')))  #{'c__avg': 206.333333}
    
    # 5 每个作者出版的所有书的价格以及最高价格的那本书的名称 (通过orm玩起来就是个死题,需要用原生sql)
    # print(models.Author.objects.values('name').annotate(c= Max('book__price')).values_list('name','book__title','c'))
    # print(models.Book.objects.values('authors__ad_id_id').annotate(m = Max('price')).values('authors__name,title'))
    # print(models.Book.objects.values_list('authors__name','price').order_by('authors__id') )
    # print(models.Book.objects.values_list('authors__name','price').order_by( '-price').filter(Q(price=224)|Q()).values('title'))
    # print(models.Book.objects.filter())
    # print(models.Book.objects.filter(Q(authors__id=1)|Q(authors__id=2)|Q(authors__id=3)).values_list('authors__name','price'))
    # print(models.Book.objects.filter(Q(authors__id=1)|Q(authors__id=2)|Q(authors__id=3)).values_list('authors__name','price'))
    
    print(models.Book.objects.annotate(c= Max('price')).values_list('authors__name','title'))
    return HttpResponse('ok')
    

    def order(request):

    for i in range(3300):

    print(i)

    return render(request,'order.html',locals())

  • 相关阅读:
    复数加法
    通过函数来实现复数相加
    声明一个类模板
    友元成员函数的简单应用
    将普通函数声明为友元函数
    引用静态数据成员
    对象的赋值
    对象的常引用
    有关对象指针的使用方法
    对象数组的使用方法
  • 原文地址:https://www.cnblogs.com/Doner/p/10940863.html
Copyright © 2020-2023  润新知