Django ORM操作 session操作 中间件

一、django ORM

定义数据库模型

models.py
定义完成后需要执行django命令生成数据表:
python manage.py makemigrations
python manage.py migrate
from django.db import models

# Create your models here.
"""
1.定义模型类
2.模型迁移
   2.1 先生成迁移文件(不会在数据库中生成表,只会创建一个 数据表和模型的对应关系)
        python manage.py makemigrations
   2.2 再迁移(会在数据库中生成表)
        python manage.py migrate
"""

"""
书籍表:
    id,name,pub_data,readcount,commentcount,is_delete
    名字,发布日期,阅读量,点评论量,是否删除
"""
class BookInfo(models.Model):

    name = models.CharField(max_length=20, unique=True, verbose_name='名字')#长度, 唯一, 后台名字
    #发布日期
    pub_data = models.DateField(null=True)  #允许为空
    #阅读量
    readcount = models.IntegerField(default=0)
    #评论量
    commentcount = models.IntegerField(default=0)
    #是否删除
    is_delete = models.BooleanField(default=False)

    #修改默认表名
    class Meta:
        db_table = 'bookinfo'
        #修改后台admin的显示信息的配置
        verbose_name = '书籍表'

    # 后台返回属性
    def __str__(self):
        return self.name

# 人物列表信息模型类
class PeopleInfo(models.Model):

    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    name = models.CharField(max_length=20, verbose_name='姓名')
    # 性别
    ggender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    description = models.CharField(max_length=200, null=True, verbose_name='功法')
    # 外键 on_delete 关联数据关系,是否同时删除,CASCADE同时删除
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='书名')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'peopleinfo'
        verbose_name = '人物信息'

    def __str__(self):

        return self.name

ORM

views.py
from django.shortcuts import render, HttpResponse

from book.models import BookInfo


# Create your views here.


def index(request):
    books = BookInfo.objects.all()

    context = {
        'books': books
    }

    return render(request, 'index.html', context)
    # return HttpResponse('index首页')

# ORM数据库操作
def mysql_s(request):
    #############################################新增数据#################################################

    BookInfo.objects.create(
        name='java',
        pub_data='2010-1-1'
    )

    #############################################修改(更新)数据#################################################

    # # 1.现查询数据
    # book = BookInfo.objects.get(id=1)
    # # 2. 直接修改示例的属性
    # book.readcount = 20
    # book.save()

    # 方法2  直接更新
    # filter 过滤
    BookInfo.objects.filter(id=1).update(
        readcount=100,
        commentcount=200
    )

    #############################################删除数据#################################################

    # ## 方法1
    # # 1.先查询出数据
    # book = BookInfo.objects.get(id=5)
    # # 2.调用删除方法
    # book.delete()

    ## 方法2
    BookInfo.objects.filter(id=6).delete()

    #############################################基本查询#################################################
    # get 得到某一个数据
    # all 获得所有的
    # count 个数

    # 返回一个对象
    book = BookInfo.objects.get(id=1)

    # 查询id 不存在的数据会抛出异常
    book = BookInfo.objects.get(id=100)
    """
    book.models.BookInfo.DoesNotExist: BookInfo matching query does not exist.
    """
    try:
        book = BookInfo.objects.get(id=100)
    # except Exception as e:
    #     pass
    except BookInfo.DoesNotExist:
        pass

    # count
    BookInfo.objects.all().count()
    # or
    BookInfo.objects.count()

    #############################################filter,get,exclude#################################################
    """
    filter        :筛选/过滤  返回n个结果  0/1/n
    get           :          返回一个接轨
    exclude       :  排除掉符合条件剩下的结果  相当与   not
    
    
    语法形式:
              以filter(字段名__运算符=值) 为例
    """

    # 查询编号为1的图书
    # exact 精准的 就是等于
    BookInfo.objects.get(id__exact=1)
    BookInfo.objects.get(id=1)

    BookInfo.objects.filter(id=1)
    BookInfo.objects.filter(id__exact=1)

    # 查询书名包含 ’湖‘ 的图书
    # contains  包含
    BookInfo.objects.filter(name__contains='湖')
    # 查询书名以 '部' 结尾的图书
    BookInfo.objects.filter(name__endswith='部')
    # 查询书名为空的图书
    BookInfo.objects.filter(name__isnull=True)
    # 查询编号为1或者3或者5的 图书
    BookInfo.objects.filter(id__in=[1, 3, 5])
    # 查询编号大于3的图书
    # gt 大于            great
    # gte  大于等于       equal
    # lt 小于            less than
    # lte 小于等于
    BookInfo.objects.filter(id__gt=3)

    # 查询书籍id不为3的图书
    BookInfo.objects.exclude(id=3)
    BookInfo.objects.exclude(id__exact=3)

    # 查询1980 年发布的图书
    BookInfo.objects.filter(pub_data__year='1980')

    # 查询1990年1月1日后发布的图书
    BookInfo.objects.filter(pub_data__gt='1990-1-1')

    ############################################# F #################################################

    # 两个属性怎么比较 F对象
    """
    F 对象的语法形式
    
    filter(字段名__运算符=F('字段名'))
    
    查询阅读量大于评论量的图书
    """
    from django.db.models import F
    # 查询阅读量大于评论量的图书
    BookInfo.objects.filter(readcount__gt=F('commentcount'))

    # 查询阅读量大于评论量2倍的图书
    BookInfo.objects.filter(readcount__gt=F('commentcount') * 2)

    ############################################# Q对象(了解) #################################################

    # 需要查询id大于2 并且 阅读量大于20的书籍
    # 方式1 filter().filter()
    BookInfo.objects.filter(id__gt=2).filter(readcount__gt=20)
    # 方式2
    # filter(条件,条件)
    BookInfo.objects.filter(id__gt=2, readcount__gt=20)

    # 需要查询id大于2 或者 阅读量大于20的书籍
    from django.db.models import Q
    """
    Q(字段名__运算符=值)
    或者  Q()|Q()
    并且  Q() & Q()
    not  ~Q()
    """
    ## 需要查询id大于2 或者 阅读量大于20的书籍
    BookInfo.objects.filter(Q(id__gt=2) | Q(readcount__gt=20))

    ## 查询书籍id不为3的
    BookInfo.objects.exclude(id=3)
    BookInfo.objects.filter(~Q(id=3))

    ############################################# 聚合函数(了解) #################################################

    """
    Sum,Max,Min,Avg,Count(个数)
    
    聚合函数需要使用 aggregate
    语法形式是: aggragte(Xxx('字段'))
    """
    # 当前数据的阅读总量
    from django.db.models import Sum, Max, Min, Avg, Count
    BookInfo.objects.aggregate(Sum('readcount'))

    ############################################# 排序 #################################################
    # 默认升序
    BookInfo.objects.all().order_by('readcount')
    # 降序
    BookInfo.objects.all().order_by('-readcount')

    ############################################# 关联查询 #################################################

    """
    书籍和人物的关系是   1 : n
    书籍 中没有任何关于人物的字段
    
    人物 中又关于书籍的字段 book 外键
    
    语法形式:
        通过书籍查询人物信息(  已知 主表数据,关联查询从表书籍)
        主表模型(实例对象).关联模型类名小写_set.all()
    
        通过人物查询书籍信息( 已知 从表书籍,关联查询主表数据)
        从表模型(实例对象).外键
        
    
    查询书籍为1的所有人信息
    查询人物为1的书籍信息
    """

    # 查询书籍为1的所有人信息

    # 通过书籍 查询人物

    # # 1.查询书籍
    # book = BookInfo.objects.get(id=1)
    # # 2.根据实际关联人物信息
    # book.peopleinfo_set.all()
    BookInfo.objects.get(id=1).peopleinfo_set.all()

    # 查询人物为1的书籍信息
    from book.models import PeopleInfo
    # # 1.查询人物
    # person = PeopleInfo.objects.get(id=1)
    # # 2.根据人物关联查询书籍
    # person.book.name
    PeopleInfo.objects.get(id=1).book.name

    ############################################# 关联查询的筛选 #################################################

    """
    书籍和人物的关系是   1 : n
    书籍 中没有任何关于人物的字段

    人物 中又关于书籍的字段 book 外键

    语法形式:
        1--
        我们需要的是 书籍信息,已知的是 人物信息
        我们需要的是 主表数据,已知的是 从表信息
        
        filter(关联模型类小写__字段名__运算符=值)
        
        2--
        我们需要的是 人物信息,已知条件是 书籍信息
        我们需要的是 从表书籍,已知条件是 主表信息
        filter(外键__字段__运算符=值)
    “”“
    
    ”“”
    查询图书。要求图书人物为 ’郭靖‘
    查询图书,要求图书中的人物的描述包含”八“
    """
    # 查询图书。要求图书人物为 ’郭靖‘
    # 需要的是图书,条件是人物
    BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
    # PeopleInfo.objects.get(name='郭靖').book

    # 查询图书,要求图书中的人物的描述包含”八“
    BookInfo.objects.filter(peopleinfo__description__contains='八')
    # PeopleInfo.objects.filter(description__contains='八')[0].book

    """
    查询书名为“天龙八部”的所有人物
    查询图书阅读量大于30的所有人物
    """
    # 查询书名为“天龙八部”的所有人物
    PeopleInfo.objects.filter(book__name='天龙八部')
    # 查询图书阅读量大于30的所有人物
    PeopleInfo.objects.filter(book__readcount__gt=50)


    ############################################# 查询集 #################################################
    ##   惰性、缓存
    # 每次都执行一次sql语句
    [book.id for book in BookInfo.objects.all()]

    # 优化 使用变量接收结果,保存在变量中
    books = BookInfo.objects.all()
    [book.id for book in books]

    ############################################# 分页 #################################################
    from django.core.paginator import Paginator

    # object_list   结果集/列表
    #  per_page     每页多少条记录
    #  p = Paginator(object_list,per_page)
    books = BookInfo.objects.all()
    p = Paginator(books, 2)
    # 获取第几页的数据   books_page 是一个列表 []
    books_page = p.page(1)
    books_page.object_list  #输出列表


二、session操作

views.py

import datetime

from django.shortcuts import render, HttpResponse, redirect
from django.urls import reverse


# Create your views here.
def index(request):
    """
    reverse  通过 name  来动态获取路径(路由)
    如果设置了 namespace 就需要用 namespace:name来获取路由
    # 登录成功之后需要跳转到首页
    # 注册成功之后需要跳转到首页
    """
    # 通过urls的 name 获取到路由的地址
    # 如果设置了 namespace 就需要用 namespace:name来获取路由
    # path = reverse('index')
    path = reverse('book:index')
    print(path)
    return HttpResponse(f'{path}')


# 设置cookie
def set_cookie(request):
    username = request.GET.get('username').encode('utf8')
    print(username)
    response = HttpResponse(f'{username}')
    response.set_cookie('username', username, max_age=3600)  # max_age 过期时间

    return response


"""
:return HttpResponse(f'username:{username}')
"""


def get_cookie(request):
    cookies = request.COOKIES
    # username = request.COOKIES.get('username')
    username = cookies.get('username')
    print(cookies)
    return HttpResponse(f'username:{username}')


def set_session(request):
    username = request.GET.get('username', '')
    password = request.GET.get('password', '')

    user_id = 66
    if username == 'admin' and password == 'admin':
        request.session['user_id'] = user_id
        # 设置session的过期时间 request.session.set_expiry(10)
        # 删除所有session数据,request.session.clear() 保留key   #flush() key都删
        return HttpResponse(f'设置的session是:{user_id}')
    else:
        return HttpResponse('账户验证不通过')


def get_session(request):
    print(request.COOKIES)

    user_id = request.session.get('user_id')
    if user_id is not None:

        return HttpResponse(f'得到的user_id:{user_id}')
    else:
        return HttpResponse('未获取到user_id')


"""
面向对象VIew
"""
from django.views import View


class LoginView(View):

    def get(self, request):
        return HttpResponse('get')

    def post(self, request):
        return HttpResponse('post')


"""
个人首页展示   登录认证判断 LoginRequiredMixin
GET 方式 展示  个人中心
POSt 实现个人中心信息的修改
定义类视图 
"""
from django.contrib.auth.mixins import LoginRequiredMixin


class CenterView(LoginRequiredMixin, View):

    def get(self, req):
        return HttpResponse('个人中心展示')

    def post(self, req):
        return HttpResponse('个人中心修改')


"""
模板语言  继承模板
"""
class Moban(View):

    def get(self, req):
        username = req.GET.get('username')
        context = {

            'username': username,
            'age': 14,
            'birthday': datetime.datetime.now(),
            'friends': ['tom', 'jack', 'rose'],
            'money': {
                '2019': 12000,
                '2020': 18000,
                '2021': 25000,
            },
            'desc': '<script>alert("hot")</script>'
        }

        return render(req, 'detail.html', context)
        return render(req, 'index.html', context)

三、Django 模板语言

.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<hr>
我的姓名是 {{ username }}
<hr>
我的年龄是 {{ age }}
<hr>
我总共有{{ friends|length }}个朋友<br>
我的朋友是 {{ friends }}
我的女朋友是 {{ friends.2 }}
<hr>
<ul>
    {% for friend in friends %}
        <li>{{ forloop.counter }}  {{ friend }}</li>
    {% endfor %}
</ul>


<hr>
{% if age > 10 %}
    我大于10岁
{% else %}
    我小于10岁
{% endif %}


<hr>
{% for foo in money.values %}
    <hr>
    我的第{{ forloop.counter }}年月薪是 {{ foo }}
{% endfor %}
<hr>

我的第2020年月薪是 {{ money.2020 }}

<hr>
{# 过滤器的语法形式:  变量|过滤器:'参数' #}
{{ birthday }}<br>
我的生日是 {{ birthday|date:'Y年 m月 d日' }}

<hr>
这是一个script脚本要使用过滤器给他启动 desc|safe<br>
{{ desc }}<br>
{{ desc|safe }}
<hr>
(default过滤器)我没有定义的变量:{{ abcde|default:'默认值' }}

</body>
</html>

django html模板继承

base.html

继承模板文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}
        这是页面的title
    {% endblock %}</title>
</head>
<body>
{% block header %}
    <h1 style="align-content: center">顶部</h1>
{% endblock %}


{% block main %}
    <h1>我是页面主题</h1>
{% endblock %}


{% block footer %}
    <h1>this is footer</h1>
{% endblock %}
</body>
</html>

detail.html

继承自base.html文件
{#把继承的模板卸载最上边#}
{%  extends 'base.html' %}

{#需要改哪里 直接实现block#}
{% block main %}
    <h1>我改变了主题</h1>
    <a href="#"> 这是一个标签</a>
{% endblock %}


{#不需要的block 直接重写#}
{% block footer %}{% endblock %}

四、Django 中间件

middleware.py

编写自定义中间件文件
"""
中间件的作用: 每次请求和相应的时候都会调用
中间件的定义
"""
def simple_middleware(get_response):

    def middleware(request):

        # 这里是请求前
        print('请求前调用')

        response = get_response(request)

        # 这里是  相应后/请求后
        print('这是响应后调用')

        return response
    return middleware

settings.py

添加中间件文件到settings文件中
# 中间件
MIDDLEWARE = [
    'book.middleware.simple_middleware',

]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值