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

  

 

原文地址:https://www.cnblogs.com/gyh412724/p/9780930.html