博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
68 聚合和分组, F和Q查询, cookie, session
阅读量:4347 次
发布时间:2019-06-07

本文共 4810 字,大约阅读时间需要 16 分钟。

主要内容: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失效策略。

  

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/gyh412724/p/9780930.html

你可能感兴趣的文章
保护HTTP的安全
查看>>
js 选取子节点时去除非IE浏览器的换行符
查看>>
javascript是一朵奇葩
查看>>
Mycat入门教程
查看>>
关于"无法解析的外部符号"问题的解决
查看>>
【JavaScript】【译】编写高性能JavaScript
查看>>
【随笔】入行必读:互联网行业薪酬等级
查看>>
Android使用开源框架加载图片
查看>>
CLR是怎么加载到内存的?
查看>>
fckeditor
查看>>
backbone.js
查看>>
python类的特殊成员变量
查看>>
sublime text3最新版本注册码(build 3143)
查看>>
linux使用技巧
查看>>
必背公式及常数
查看>>
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
查看>>
EntityManager的merge()方法
查看>>
Spring中线程池的应用
查看>>
前端登录jq图形验证码
查看>>
软件设计
查看>>