一、django ORM
定义数据库模型
models.py
定义完成后需要执行django命令生成数据表:
python manage.py makemigrations
python manage.py migrate
from django.db import models
"""
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'
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='功法')
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
def index(request):
books = BookInfo.objects.all()
context = {
'books': books
}
return render(request, 'index.html', context)
def mysql_s(request):
BookInfo.objects.create(
name='java',
pub_data='2010-1-1'
)
BookInfo.objects.filter(id=1).update(
readcount=100,
commentcount=200
)
BookInfo.objects.filter(id=6).delete()
book = BookInfo.objects.get(id=1)
book = BookInfo.objects.get(id=100)
"""
book.models.BookInfo.DoesNotExist: BookInfo matching query does not exist.
"""
try:
book = BookInfo.objects.get(id=100)
except BookInfo.DoesNotExist:
pass
BookInfo.objects.all().count()
BookInfo.objects.count()
"""
filter :筛选/过滤 返回n个结果 0/1/n
get : 返回一个接轨
exclude : 排除掉符合条件剩下的结果 相当与 not
语法形式:
以filter(字段名__运算符=值) 为例
"""
BookInfo.objects.get(id__exact=1)
BookInfo.objects.get(id=1)
BookInfo.objects.filter(id=1)
BookInfo.objects.filter(id__exact=1)
BookInfo.objects.filter(name__contains='湖')
BookInfo.objects.filter(name__endswith='部')
BookInfo.objects.filter(name__isnull=True)
BookInfo.objects.filter(id__in=[1, 3, 5])
BookInfo.objects.filter(id__gt=3)
BookInfo.objects.exclude(id=3)
BookInfo.objects.exclude(id__exact=3)
BookInfo.objects.filter(pub_data__year='1980')
BookInfo.objects.filter(pub_data__gt='1990-1-1')
"""
F 对象的语法形式
filter(字段名__运算符=F('字段名'))
查询阅读量大于评论量的图书
"""
from django.db.models import F
BookInfo.objects.filter(readcount__gt=F('commentcount'))
BookInfo.objects.filter(readcount__gt=F('commentcount') * 2)
BookInfo.objects.filter(id__gt=2).filter(readcount__gt=20)
BookInfo.objects.filter(id__gt=2, readcount__gt=20)
from django.db.models import Q
"""
Q(字段名__运算符=值)
或者 Q()|Q()
并且 Q() & Q()
not ~Q()
"""
BookInfo.objects.filter(Q(id__gt=2) | Q(readcount__gt=20))
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的书籍信息
"""
BookInfo.objects.get(id=1).peopleinfo_set.all()
from book.models import PeopleInfo
PeopleInfo.objects.get(id=1).book.name
"""
书籍和人物的关系是 1 : n
书籍 中没有任何关于人物的字段
人物 中又关于书籍的字段 book 外键
语法形式:
1--
我们需要的是 书籍信息,已知的是 人物信息
我们需要的是 主表数据,已知的是 从表信息
filter(关联模型类小写__字段名__运算符=值)
2--
我们需要的是 人物信息,已知条件是 书籍信息
我们需要的是 从表书籍,已知条件是 主表信息
filter(外键__字段__运算符=值)
“”“
”“”
查询图书。要求图书人物为 ’郭靖‘
查询图书,要求图书中的人物的描述包含”八“
"""
BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
BookInfo.objects.filter(peopleinfo__description__contains='八')
"""
查询书名为“天龙八部”的所有人物
查询图书阅读量大于30的所有人物
"""
PeopleInfo.objects.filter(book__name='天龙八部')
PeopleInfo.objects.filter(book__readcount__gt=50)
[book.id for book in BookInfo.objects.all()]
books = BookInfo.objects.all()
[book.id for book in books]
from django.core.paginator import Paginator
books = BookInfo.objects.all()
p = Paginator(books, 2)
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
def index(request):
"""
reverse 通过 name 来动态获取路径(路由)
如果设置了 namespace 就需要用 namespace:name来获取路由
# 登录成功之后需要跳转到首页
# 注册成功之后需要跳转到首页
"""
path = reverse('book:index')
print(path)
return HttpResponse(f'{path}')
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)
return response
"""
:return HttpResponse(f'username:{username}')
"""
def get_cookie(request):
cookies = request.COOKIES
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
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',
]