Django 中ORM的高级查询用法

from django.shortcuts import render
from django.http import HttpResponse
from datetime import date

from .models import *

def select(request):
    # 1.单表数据查询
    # 查询id>1且id<3的所有出版社
    # id_lte:小于等于  id_gte:大于等于
    results = Publication.objects.filter(id__lt=3, id__gt=1)

    results = Publication.objects.filter(id__in=[1,2])
    # 查询id!=1的出版社.exclude():取反
    results = Publication.objects.exclude(id__in=[1])

    # 包含关系查询:比如查询出版社名称中含有"新"的出版社
    results = Publication.objects.filter(name__contains='新')
    '''
    name__startswith='新':查询name字段的值以"新"开头的Model对象
    name__endswith='新':查询name字段的值以"新"结尾的Model对象
    name__istartswith='新':查询name字段的值以"新"开头的Model对象.(如果值是英文,忽略大小写)
    
    '''

    # 查询2018年的所有数据
    results = Publication.objects.filter(create_time__year=2018)
    # 查询某一个时间范围内的数据
    start_time = date(2018,10,1)
    end_time = date(2018,11,16)
    results = Publication.objects.filter(create_time__range=(start_time,end_time))
    # 查询2018年以后的数据
    start_time = date(2018,1,1)
    result = Publication.objects.filter(create_time__gt=start_time)

    for result in results:
        print(result.name)

    return HttpResponse('ok')

# 引入Django内置的统计函数:求平均值、最大值、最小值、组内数据个数、求和
from django.db.models import Avg,Max,Min,Count,Sum
def annotate(request):
    '''
    数据的分组查询,指的就是根据某一个表中的字段,对所有数据进行分组,然后再对分组之后的数据进行操作
    :param request:
    :return:
    '''
    # 1.单表的分组查询
    # 图书表:Book。将图书表中的所有数据,按照图书的级别进行分组,统计每一个分组中的数据个数
    # Book.objects.values('level'):将数据按照level的值进行分组,分完组以后,再调用annotate进行数据的统计
    # {'level': '中级', 'level__count': 1}, {'level': '初级', 'level__count': 2}, {'level': '高级', 'level__count': 1}
    result = Book.objects.values('level').annotate(Count('level'))

    # 先按照级别分组,再统计每一个分组的价格平均值。
    # {'level': '中级', 'price__avg': 150.0}, {'level': '初级', 'price__avg': 115.25}, {'level': '高级', 'price__avg': 180.5}
    # price__avg: 价格字段price + 统计函数Avg  共同组成这个键
    result = Book.objects.values('level').annotate(Avg('price'))

    result = Book.objects.values('level').annotate(avg_price = Avg('price'))


    # 先按照级别分组,再统计每一个分组的个数,最后再按照个数进行升序/降序排列
    result = Book.objects.values('level').annotate(count=Count('level')).order_by('count')   # ('-count')
    # for r in result:
    #     print(r['count'])

    # 2.多表联查
    # 查询图书表:按照出版社进行分组,然后在统计这个出版社出版的个数
    result = Book.objects.values('publication').annotate(count=Count('publication'))



    # a. 统计每一个出版社中价格最低的图书
    result = Book.objects.values('publication').annotate(min=Min('price'))
    # b. 统计出出版社出版图书数量大于1的图书信息;
    result = Book.objects.values('publication').annotate(count=Count('publication'))
    for r in result:
        if r['count']>1:
            print(r['publication'])
            results = Book.objects.filter(publication_id=r['publication'])
            for res in results:
                print('图书ID:{}  图书名称:{}  图书价格:{}  图书级别:{}  所属出版社:{}'.format(res.id,res.name,res.price,res.level,res.publication))

    # c. 统计每一个出版社出版所有图书的总价格;
    result = Book.objects.values('publication').annotate(sum=Sum('price'))
# 3365    10.17
# 2116.16
# 2616
    return HttpResponse('ok')










猜你喜欢

转载自blog.csdn.net/zhangmengran/article/details/84109497