ORM的增删改
以注册功能为例
1.增
方式一:
res1 = models.UserInfo.objects.create(name = username,pwd =password)
print(res1) # UserInfo object res返回的是当前插入的对象
方式二:
res = models.UserInfo(name = username,pwd =password)
res.save()
2.改
方式一:
res = models.UserInfo.objects.filter(pk = edit_id).update(name = username,pwd = password) # update userinfo set username=username, password=password where id = edit_id;
方式二:句点符修改
edit_obj = models.UserInfo.objects.filter(id = edit_id).first()
edit_obj.name = username
edit_obj.pwd = password
edit_obj.save()
3.删
方式一:物理删除
delete_id = request.GET.get('delete_id ')
models.UserInfo.objects.filter(id = delete_id).delete()
方式二:软删除
models.UserInfo.objects.filter(pk=delete_id).update(is_delete = True)
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
from aap01 import models
def register(request):
if request.method == 'GET':
return render(request,'register.html')
if request.method == 'POST':
# 1.获取post请求的数据
username= request.POST.get('username')
password = request.POST.get('password')
# .读取数据库的名字信息,查看有没有
res = models.UserInfo.objects.filter(name = username)
if res:
return HttpResponse('用户名已经存在')
# 需求:注册成功后 展示用户数据
models.UserInfo.objects.create(name=username,pwd=password)
return redirect('/show_data/')
# 需求:注册成功后 展示用户数据
def show_data(request):
# 模版语法
# 1.方式一:
# user_dic = {'name':'nana','pwd':123}
# dic1 = {'a':1}
# return render(request,'show_data.html',{'user_dic':user_dic,'dic':dic1})
# 2.方式2:
user_data = models.UserInfo.objects.filter(is_delete=0)
# print(user_data)
# print(locals()) #
return render(request,'show_data.html',locals())
def edit_data(request):
# 1.通过get请求数据获取值id
edit_id = request.GET.get('edit_id')
print(edit_id)
# 2.根据数据值,在数据库中查找
edit_obj = models.UserInfo.objects.filter(id = edit_id).first()
print(edit_obj)
# 3.根据ID,修改东西提交
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# res = models.UserInfo.objects.filter(pk = edit_id).update(name = username,pwd = password)
edit_obj.name = username
edit_obj.pwd = password
edit_obj.save()
return redirect('/show_data/')
return render(request,'edit_data.html',locals())
def delete_data(request):
# get请求获取id
print(request.GET) # <QueryDict: {'delete_id ': [' 6']}>
delete_id = request.GET.get('delete_id ')
print(delete_id)
# 根据id删除
# # 方式一:
# models.UserInfo.objects.filter(id = delete_id).delete()
# print('删除成功')
# return redirect('/show_data/')
# 方式二 软删除
# 更新字段,把is_delete的值有0变为1,展示0的数据
models.UserInfo.objects.filter(pk=delete_id).update(is_delete = True)
return redirect('/show_data/')
模版语法
1.方式一:
# views.py
def data_list():
user_dic = {'name':'nana','pwd':123}
dic1 = {'a':1}
return render(request,'show_data.html',{'user_dic':user_dic,'dic':dic1})
# show_data.html
{{user_dic.name}} # nana
{{user_dic.pwd}} # 123
{{dic.a}} # 1
2.方式二
def show_data(request):
user_dic = {'name':'nana','pwd':123}
dic1 = {'a':1}
print(locals()) # {'dic1': {'a': 1}, 'user_dic': {'name': 'nana', 'pwd': 123}, 'request': <WSGIRequest: GET '/show_data/'>}
return render(request,'show_data.html',locals())
5.在jango中,提供了一种在html中显示后端数据的一些方法
1.{{...}}
2.{% for obj in data%}
...
{% endfor %}
ORM创建表关系
一对一
1.例如:作者与作者详情表
2.外键:外键字段建在任何一方都可以,一般建在查询频率较高的表
3.举例:
class Author(models.Model):
name = models.CharField(max_length=32)
author_detail = models.OneToOneField(to = "AuthorDetail",to_fields='id')
# 同等于
author_detail= models.OneToOneField(to="AuthorDetail")默认是与AuthorDetail表的主键建立关系
class AuthorDetail(models.Model):
phone = models.CharField(max_length=64)
qq = models.CharField(max_length=64)
wechat = models.CharField(max_length=64)
4.注意:
1.如果是外键字段的话,会自动帮你拼接_id,如果你自己写了,它也会给你拼上
2.author_detail = models.OneToOneField(to='AuthorDetail')
to ='表名' ,表名以后都写在引号里面,防止找不到
一对多
1.例如:图书和出版社是一对多的关系
2.外键:外键字段建在多的一方,图书是多,外键建在book表中
3.举例:
class Book(models.Model):
name = models.CharField(max_length=64)
price = models.DecimalField(max_digits= 8,decimal_places=2)
"""
max_digits=None, 总位数
decimal_places=None 小数后面的位数
"""
# Book_Publish_id = models.ForeignKey(to = 'Publish',to_fields='id')
# 等同于:
Book_Publish_id = models.ForeignKey(to='Publish')
class Publish(models.Model):
name = models.CharField(max_length=64)
addr = models.CharField(max_length=255)
多对多
1.例如:图书和作者是多对多的关系
2.外键:外键字段建在第三张表,使用虚拟字段建立第三张表,虚拟字段建在任何一张表中都是可以的,建在查询频率较高的一张表
3.举例:
class Book(models.Model):
name = models.CharField(max_length=64)
price = models.DecimalField(max_digits= 8,decimal_places=2)
authors = models.ManyToManyField('Author')
class Author(models.Model):
name = models.CharField(max_length=32)
4.ps:
1.models.DecimalField(max_length= 8,decimal_places=2)
1.max_digits=None, 总位数
2.decimal_places=None 小数后面的位数
2.authors字段是一个虚拟字段,意思是不会在book表中创建出来authors字段,它就是用来告诉django给我创建出来第三张表
1.创建外键关系的时候,先创建一张表中得基础字段,在创建外键字段
2.在django1中,默认是级联删除级联更新;在django2中,现在的创建代码就不行了
on_delete参数
1.on_delete:当删除关联表中的数据时,当前表与其关联的行的行为。
2.models.CASCADE:删除关联数据,与之关联也删除
3.models.DO_NOTHING:删除关联数据,引发错误IntegrityError
4.models.PROTECT:删除关联数据,引发错误ProtectedError
5.models.SET_NULL:删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
6.models.SET_DEFAULT:删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
7.models.SET:删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
eg:Book_Publish_id = models.ForeignKey(to='Publish' on_delete = models.CASCADE)
Django请求生命周期
我们使用Django框架就是为了开发application,而application的工作过程本质就是根据不同的请求返回不同的数据,Django框架将这个工作过程细分为如下四层去实现
1、路由层(根据不同的地址执行不同的视图函数,详见urls.py)
2、视图层(定义处理业务逻辑的视图函数,详见views.py)
3、模型层 (跟数据库打交道的,详解models.py)
4、模板层(待返回给浏览器的html文件,详见templates)
ps:1.中间件 MIDDLEWARE = [# 'django.middleware.csrf.CsrfViewMiddleware']
1.web服务网关接口:请求来的时候,处理http协议的数据,处理成比较方便的数据格式
请求走的时候,再封装打包数据为http格式
WSGI, uWSGI, uwsgi一文搞
1.WSGI是一个协议,wsgi server (比如uWSGI) 要和 wsgi application(比如django )交互,uwsgi需要将过来的请求转给django 处理,那么uWSGI 和 django的交互和调用就需要一个统一的规范,这个规范就是WSGI WSGI(Web Server Gateway Interface)
2.uWSGI:就是一个服务器(wsgiref、uwsgi)
3.uwsgi:是一个协议,是nginx(服务器,转发请求)到uWSGI之间的一个协议