49、 ORM的增删改 ORM创建表的关系 Django的请求生命周期

143 阅读5分钟

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格式

结构.png 图片转存失败,建议将图片保存下来直接上传
生命周期(/Users/na/Desktop/python%E8%B5%84%E6%96%99/python%E5%9B%BE%E7%89%87/python%E5%9B%BE%E7%89%87/Django/%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.png)

生命周期.png

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之间的一个协议

wsgi.png