• 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失效策略。
    

      

     

  • 相关阅读:
    HTTP请求头的具体含意
    Python 之类与对象及继承
    PHP的一个牛逼的数组排序函数array_multisort
    mysqli返回受影响行数
    转:JS判断值是否是数字(两种方法)
    转:php中判断某个IP地址是否存在范围内
    php Closure::bind的用法(转)
    Drupal8入门文章推荐
    PHP通过api上传图片
    转:PHP中的使用curl发送请求(GET请求和POST请求)
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9780930.html
Copyright © 2020-2023  润新知