主要内容: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
<form action="" method="post"> <p>用户名: <input type="text" name="user"> </p> <p>密码: <input type="password" name="password"> </p> <p> <input type="submit" value="提交"> </p> </form>
index
<p>这是index页面</p> <a href="/logout/">注销</a>
4 : session
session的由来: Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。
session的获取,设置, 删除
# 获取、设置、删除Session中数据 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1']
其他方法:
# 会话session的key request.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失效策略。