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')
Django 中ORM的高级查询用法
猜你喜欢
转载自blog.csdn.net/zhangmengran/article/details/84109497
今日推荐
周排行