zoukankan      html  css  js  c++  java
  • 68 聚合和分组, F和Q查询, cookie, session

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

      

     

  • 相关阅读:
    gc buffer busy/gcs log flush sync与log file sync
    给Oracle年轻的初学者的几点建议
    Android 编程下帧动画在 Activity 启动时自动运行的几种方式
    Android 编程下 Touch 事件的分发和消费机制
    Java 编程下 static 关键字
    Java 编程下 final 关键字
    Android 编程下模拟 HOME 键效果
    Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated ?
    Extjs4 大型项目目录结构重构
    [转]SQLServer 2008 允许远程连接的配置方法
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9780930.html
Copyright © 2011-2022 走看看