django 知识概括 (一)
web 框架的本质
socket服务端 与 浏览器的通信
socket服务端功能划分:
a. 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn...
b. 根据用户访问不同的路径执行不同的函数
c. 从HTML读取出内容,并且完成字符串的替换 --> jinja2(模板语言)
什么是wsgi
WSGI 就是一种规范,它定义了web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。
常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器和浏览器之间进行通信的。
ORM简单的增加和查询
1. 查询
models.UserInfo.objects.all()
2. 增加
models.UserInfo.objects.create(name="张三")
重定向
from django.shortcuts import HttpResponse, render, redirect
return redirect('/index')
orm排序
ret = models.Publisher.objects.all().order_by("id")
orm 删除一条数据
# 根据id值查找到数据 del_obj = models.Publisher.objects.get(id=del_id) # 删除 del_obj.delete() # 或者 models.Publisher.objects.get(id=7).delete()
orm 修改一条数据
edit_id = request.POST.get("id")
new_name = request.POST.get("publisher_name")
# 更新出版社
# 根据id取到编辑的是哪个出版社
edit_publisher = models.Publisher.objects.get(id=edit_id)
edit_publisher.name = new_name
edit_publisher.save() # 把修改提交到数据库
图书管理系统表结构设计
from django.db import models
# 出版社
class Publisher(models.Model):
id = models.AutoField(primary_key=True) # 自增的ID主键
# 创建一个varchar(64)的唯一的不为空的字段
name = models.CharField(max_length=64, null=False, unique=True)
addr = models.CharField(max_length=128)
def __str__(self):
return "<Publisher Object: {}>".format(self.name)
# 书
class Book(models.Model):
id = models.AutoField(primary_key=True) # 自增的ID主键
# 创建一个varchar(64)的唯一的不为空的字段
title = models.CharField(max_length=64, null=False, unique=True)
# 和出版社关联的外键字段
publisher = models.ForeignKey(to="Publisher")
def __str__(self):
return "<Book Object: {}>".format(self.title)
# 作者表
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, null=False, unique=True)
# 告诉ORM 我这张表和book表是多对多的关联关系,ORM自动帮我生成了第三张表
book = models.ManyToManyField(to="Book")
def __str__(self):
return "<Author Object: {}>".format(self.name)
表的关系:
1. 一本书 只能 有一个出版社
2. 一本书 能有 多个作者
3. 一个作者 能写 多本书
出版社和书: 一对多 --> 外键
书和作者: 多对多 --> 用第三张表做关联
增加图书
new_title = request.POST.get("book_title")
new_publisher_id = request.POST.get("publisher")
# 创建新书对象,自动提交
models.Book.objects.create(title=new_title, publisher_id=new_publisher_id)
# 用出版社对象创建
publisher_obj = models.Publisher.objects.get(id=new_publisher_id)
models.Book.objects.create(title=new_title, publisher=publisher_obj)
查询作者有哪些书 (多对多)
{% for author in author_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ author.id }}</td>
<td>{{ author.name }}</td>
<td>
{% for book in author.book.all %}
{{ book.title }}
{% endfor %}
自定义过滤器
自定义过滤器只是带有一个或两个参数的Python函数:
例如,在过滤器{{var | foo:'bar'}}中,过滤器foo将传递变量var和参数“bar”
{{ name|sb }} 过滤器将传递变量name
自定义filter代码文件摆放位置:
app01/
__init__.py
models.py
templatetags/ # 在app01下面新建一个package package
__init__.py
app01_filters.py # 建一个存放自定义filter的文件
views.py
myfilter.py
from django import template
register = template.Library()
# 告诉Django的模板语言我现在有一个自定义的filter方法,名字叫sb
@register.filter(name="sb")
def add_sb(arg):
return "{} sb.".format(arg)
@register.filter(name="addstr")
def add_str(arg, arg2):
"""
第一个参数永远是管道符前面那个变量
:param arg: 道符前面那个变量
:param arg2: 冒号后面的变量
:return:
"""
return "{} {}.".format(arg, arg2)
在模板中使用自定义过滤器
{% load myfilter %} # {% load py文件名 %}
{{ name|sb }} {{ name|addstr:"口活好~" }}

自定义simpletag
和自定义filter类似,只不过接收更灵活的参数。
定义注册simple tag
@register.simple_tag(name="plus")
def plus(a, b, c):
return "{} + {} + {}".format(a, b, c)
使用自定义simple tag
{% load myfilter%}
{%plus wangzhen' 'changjiang' 'buyaolian' %}

inclusion_tag
多用于返回html代码片段
@register.inclusion_tag('results.html')
def show_results(n):
n = 1 if n < 1 else int(n)
data = ["第{}项".format(i) for i in range(1, n+1)]
return {"results": data}
用法
{% load myfilter%}
{% show_results 10 %}

类视图
from django.views import View
class AddPublisher(View):
pass
反向解析
本质上就是给url匹配模式起别名,然后用过别名拿到具体的URL路径
使用
在url匹配模式中,定义name="别名"
在模板语言里面使用:
{% url "别名" %} --> 得到具体的URL路径
在视图中如何使用:
from django.urls import reverse
reverse("别名") --> 得到具体的URL路径
如何传参数?
模板语言中
{% url "别名" 2018 "nb" %}
视图函数中
from django.urls import reverse
reverse("别名", args=(2018, "nb"))
路由系统
正则表达式的模糊匹配
url(r'^book/([0-9]{2,4})/([a-zA-Z]{2})/$', views.book, name="book"),
关键字参数
url(r'^book/(?P<year>[0-9]{2,4})/(?P<title>[a-zA-Z]{2})/$', views.book, name="book")
表和表之间的对应关系
一对多(出版社和书)
publisher = models.ForeignKey(to="Publisher")
在数据库中:
有没有publisher这个字段?
数据库中实际 生成的是一个 publisher_id 字段
多对多(作者和书)
books = models.ManyToManyField(to="Book")
在数据库中:
是通过第三张表建立的关系
增删改查
1. 单表增删改查
增:
models.Publisher.objects.create(name="沙河出版社")
查:
models.Publisher.objects.get(id=1)
models.Publisher.objects.get(name="沙河出版社")
删:
models.Publisher.objects.get(id=1).delete()
改:
obj = models.Publisher.objects.get(id=1)
obj.name = "沙河第二出版社"
obj.save()
2. 外键的增删改查
增、删、查同上
book_obj = models.Book.objects.get(id=1)
book_obj.publisher 是什么? *****
和我这本书关联的出版社对象
book_obj.publisher.id 和我这本书关联的出版社的id值
book_obj.publisher.name 和我这本书关联的出版社的名称
book_obj.publisher_id 是什么?
和我这本书关联的出版社的id值
3. 多对多操作
1. 查id为1的作者都写过的书?
author_obj = models.Author.objects.get(id=1)
author_obj.books.all() --> 和我这个作者关联的所有书对象
2. 想给作者绑定多本书?
author_obj = models.Author.objects.get(id=1)
author_obj.books.set([1,2,3]) --> 把id是1、2、3的书和我这个作者关联上
时间间隔的用法
import datetime now = datetime.datetime.now() # 你领了一张有效期为7天的优惠券 print(now) # 时间间隔 d7 = datetime.timedelta(days=1) # 求失效时间 ret = now + d7 print(ret)

Django ORM常用字段
1. AutoField --> 自增 id = models.AutoField(primary_key=True) 2. CharField --> varchar(xx) name = models.CharField(max_length=32) 3. ForeignKey --> 外键 publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE, db_constraint=False) 4. ManyToManyField --> 多对多关联 books = models.ManyToManyField(to="Book") 5. DateTimeField和DateField和TimeField 存储的内容分别对应着datetime(),date(),time()三个对象
。
6. IntegerField age = models.IntegerField(default=18)
常用的字段参数
null 是否允许为空 true / false
default 设置默认值
unique 设置唯一值
db_index 设置索引 true / false
DateTimeField和DateField和TimeField 才有的参数
auto_now=Ture,每次更新数据的时候更新当前时间
auto_now_add=True,创建数据的时候自动把当前时间赋值
class Meta:
db_table = "表名"
在Python脚本中调用Django环境
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
import django
django.setup()
from app01 import models
books = models.Book.objects.all()
print(books)

浙公网安备 33010602011771号