主要内容:https://www.cnblogs.com/maple-shaw/articles/9502602.html
1 聚合和分组:
a : 先导入聚合函数: from django.db.models import Max, Min, Avg, Count, Sum
b : 可以为聚合函数设置名字: max = Max('price')
c : 聚合用到了aggregate, 是queryset的一个终止语句, 获取的结果是一个字典的形式.
from django.db.models import Avg, Sum, Max, Min, Count ret = models.Book.objects.all().aggregate(Avg('price')) # print(ret) # aggregate(), 是queryset的一个终止语句, 返回值是一个字典 ret1 = models.Book.objects.all().aggregate(Max('price')) # print(ret1) #{'price__max': Decimal('49.00')}获取的是一个字典形式 # 也可以为聚合值指定一个名称 ret2 = models.Book.objects.all().aggregate(max_price=Max('price')) # print(ret2)
d : annotate , 会为对象添加一个结果所需要的键值对.
# 统计每一本书的作者个数 ret3 = models.Book.objects.all().annotate(Count('authors')).values() # for i in ret3: # print(i) # 统计出每个出版社买的最便宜的书的价格 ret4 = models.Press.objects.all().annotate(Min('books__price')).values() # for i in ret4: # print(i) # 统计不止一个作者的图书 ret5 = models.Book.objects.annotate(count1=Count('authors')).values().filter(count1__gt=1).values() # for i in ret5: # print(i) # 查询各个作者出的书的总价格 ret6 = models.Author.objects.all().annotate(sum=Sum('books__price')).values() for i in ret6: print(i)
2 F查询和Q查询:
F查询: 就是动态的获取一个字段的值,
ret = models.Book.objects.filter(sale__gt=F('kucun')) # print(ret) ret1 = models.Book.objects.filter(id=2).update(sale=100) # 仅仅更新一个sale字段 # print(ret1) # obj = models.Book.objects.get(id=3) # obj.sale = 20 #更新了整个对象 # obj.save() # 把所有的sale值都增加了一倍 ret2 = models.Book.objects.all().update(sale=F('sale')*2) # print(ret2)
Q查询: 就是可以有多个条件:
ret3 = models.Book.objects.filter(Q(kucun__gt=40) | Q(kucun__lt=20) ).values() # for i in ret3: # print(i) ret4 = models.Book.objects.filter(Q(kucun__lt=40) & Q(sale__gt=4000)).values() print(ret4) ret5 = models.Book.objects.filter(~Q(kucun__lt=40) & Q(sale__gt=4000)).values() print(ret5)
3 session 和 cookie
a : cookie
定义 : 就是保存在浏览器本地上的一组组键值对
特性 : 服务器让浏览器进行保存cookie
浏览器有权利是否进行保存
再次访问服务器的时候会携带着相应的cookie
b : 设置cookie :
ret = Httpresponse('xxx')
ret.set_cookie(key, value, max_age): 超时时间
c : 获取cookie:
request.COOKIES.get('key')
d : 删除:
ret = Httpresponse('xxx')
ret.delete_cookie(key)
ret = redirect('/login/') ret.delete_cookie('is_login') return ret
e : 基于cookie的登录验证
from django.shortcuts import render, redirect, HttpResponse # 定义一个装饰器用于登录校验 def login_required(fn): def inner(request, *args, **kwargs): if not request.COOKIES.get('is_login') == '1': # 如果没有登录, 首先获取该网站的全部url next = request.path_info # 然后跳转到登录网址, 后面拼接以后要访问的地址 return redirect('/login/?next={}'.format(next)) ret = fn(request, *args, **kwargs) return ret return inner def login(request): if request.method == 'POST': username = request.POST.get('user') password = request.POST.get('password') if username == 'alex' and password == 'alex123': # 获取要执行的网址 next = request.GET.get('next') # 如果该网址存在, 跳转到该网址, if next: ret = redirect(next) # 如果没有则默认跳转到主页面(把index设置为主页面). else: ret = redirect('/index/') ret.set_cookie('is_login', '1', max_age=5) return ret return render(request, 'login.html') @login_required def home(request): # print(request.COOKIES, type(request.COOKIES)) return HttpResponse('这是home页面') @login_required def index(request): return render(request, 'index.html') def logout(request): ret = redirect('/login/') ret.delete_cookie('is_login') return ret
html中的内容:login
index
这是index页面
注销
4 : session
session的由来: Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。
session的获取,设置, 删除
# 获取、设置、删除Session中数据request.session['k1']request.session.get('k1',None)request.session['k1'] = 123request.session.setdefault('k1',123) # 存在则不设置del request.session['k1']
其他方法:
# 会话session的keyrequest.session.session_key# 将所有Session失效日期小于当前日期的数据删除request.session.clear_expired()# 检查会话session的key在数据库中是否存在request.session.exists("session_key")# 删除当前会话的所有Session数据request.session.delete() # 删除当前的会话数据并删除会话的Cookie。request.session.flush() 这用于确保前面的会话数据不可以再次被用户的浏览器访问 例如,django.contrib.auth.logout() 函数中就会调用它。# 设置会话Session和Cookie的超时时间request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。