当前位置: 首页 > news >正文

Day 56 Django 连接数据库 ORM

Day 56 Django 连接数据库 ORM

文章目录

  • Day 56 Django 连接数据库 ORM
    • 1、静态文件 及相关配置
      • 1.1、静态文件
      • 1.2、分类管理
      • 1.3、接口 资源 配置
    • 2、请求方法
      • 2.1、GET请求
      • 2.2、POST请求
    • 3、request对象方法
    • 4、连接MySQL
      • 4.1、pycharm连接MySQL
      • 4.2、django连接MYSQL
    • 5、django orm
      • 5.1、创建表
      • 5.2、html django sql 用户登录校验
    • 6、orm语法
    • 7、orm外键关联
    • 作业:
      • views
      • user_info.html
      • create_info.html
      • update.html

1、静态文件 及相关配置

我们在访问django框架资源的使用之所以可以拿到数据 是因为提前在urls.py 中开设了相应的资源接口 如果访问不到资源 那么就是没有开设相应的接口

1.1、静态文件

html项目上使用的不经常改变的资源

  1. 第三方框架文件
  2. css文件
  3. js文件
  4. 图片文件

针对静态文件资源一般都会放在static文件夹内

1.2、分类管理

当static目录下出现了很多不同类型的静态文件资源 那么还可以分类管理

  • others文件
    • 第三方框架文件
  • css文件夹
    • 所有的css文件
  • js文件夹
    • 所有的js文件
  • img文件夹

1.3、接口 资源 配置

针对静态文件资源的访问也需要提前开设相应的接口

STATIC_URL = '/static/'  #这个是 接口前缀 与文件名无关

静态文件资源配置

STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')
]  #可以理解为将 static 静态文件夹 添加至pycharm环节变量

动态解析
自动 识别接口前缀 加到地址中

{% load static%}  #
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">

2、请求方法

URL:统一资源定位符(网址)

2.1、GET请求

朝别人索要数据

  • 也可以携带额外的数据

    url?xxx=yyy&zzz=oo&aaa=bb  通过 网址后面跟问好 通过双打等号形式携带数据 后端获取为 键值对
    
  • 上述携带数据的方式有两个限制

    • 数据只能是游戏额无关紧要的非敏感数据
    • 数据的大小有限制 2kb-4kb左右
    • GET请求没有请求体(HTTP数据格式)

2.2、POST请求

朝别人提交数据

  • 也可以携带额外的数据
    • 数据都是放在请求体中 并且数据大小没有限制

**form表单默认的数据提交方式是GET **

<form action="" method="post"></form>  action  控制数据的提交地址

action 数据的提交地址填写方式
方式一:不写 朝当前页面所在的地址提交
方式二:写后缀 /index/自动补全ip和port
方式三:写全称 https://www.baidu.com/

提交post请求 前期 返回403状态码 需要去配置文件中注释一行代码

MIDDLEWARE = [
    # 'django.middleware.csrf.CsrfViewMiddleware',
]

3、request对象方法

def login(request):
    if request.method=='GET':  #判断 请求方式
        return render(request,'login.html')  直接 返回主页
    print(request.method)  #POSt 提交数据 确实 POST方式 
    print(request.POST)  #查看 POST请求体代码
    return HttpResponse('hahahh')
方法功能
request.method获取请求方式 结果是纯种大写的字符串
request.POST获取POST请求发送来的普通数据(不包含文件)
request.POST.get()默认只获取列表中最后一个数据
request.POSt.getlist()获取键对应的整给列表 无论有几个数据值
request.GET获取url后面携带的非敏感数据(不是 单单获取get请求携带的参数)
request.GET.get()默认只获取列表中最后一个数据值
request.GET.getlist()获取键对应的整个列表 无论有几个数据值

4、连接MySQL

4.1、pycharm连接MySQL

  1. pycharm与上方侧边 database
  2. pycharm左下方边角 database

上述两个地方都没有 下载插件 或重装pycharm
首次连接数据库需要下载对应的驱动
连接数据库时 先测试连接

4.2、django连接MYSQL

django默认使用的是sqlite3 但是这款数据库 一般用于本地测试 功能很少

在配置文件 修改配置

#将原本 sqlite3的 配置 给注释掉

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  #指定数据库软件名称
        'NAME':'html_db',  #指定库名
        'USER':'ROOT',
        'PASSWORD':'123',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'CHARSET':'UTF8'
    }
}

指定链接MySQL的模块
django1.11 版本需要在项目或者应用目录下的__init__.py中编写一行代码

import pymysql
pymysql.install_as_MySQLdb()

django2.2 以上版本需要使用mysqlclient模块

5、django orm

ORM:对象关系映射

python映射成sql
映射成
对象映射成记录
对象点属性映射成字段对应的值

ORM的存在可以让不会MYSQL的python程序员 使用python的语法简单快捷的操作MySQL

5.1、创建表

先去应用 目录下的 models.py编写模型类

class User(models.Model):
    # id int primary key auto_increment
    id = models.AutoField(primary_key=True)
    # name varchar(32)
    name = models.CharField(max_length=32)
    # pwd int
    pwd = models.IntegerField()

数据库迁移/同步命令

  1. 将models 中有关数据库的操作记录下来(migrations 文件夹)

    python3.7 manage.py makemigration
    
  2. 将操作真正影响到数据库中

    python3.7 manage.py migrate
    

当修改了models中 与数据库相关的代码 都必须执行上述的命令
可以简写 通过Tools 中 Run manage.py Task..

表的主键在orm中 可以不写 orm会自动帮你添加一个id的主键
如果你需要主键的名称不叫id 只能自己创建

当你要删除 创建的字段 直接将此行代码 注释 执行迁移命令 就会将数据库 一起同步修改

5.2、html django sql 用户登录校验

def login(request):
    if request.method == 'GET':
        return render(request,'login.html')
    username=request.POST.get('username')  #获取 username对应的列表中 最后一个 值
    password=request.POST.get('password')	#获取password对应的列表中最后一个值
    #select * from App01_User where name=username and pwd=password
    user_obj=models.User.objects.filter(name=username,pwd=password).first()  # 结果是 列表套对象   first()获取 第一个元素
    if user_obj:  #判断 对象 是否存在
        print(user_obj[0].id)
        print(user_obj[0].name)
        print(user_obj[0].pwd)
    return HttpResponse('hahahh')

6、orm语法

models.User.object.filter()   #结果可以看成时一个列表套数据对象

如何获取对象? 可以使用first()方法 如果没有值会返回None 我们if判断即可

models.User.object.create(name=username,pwd=password) #注册功能

models.User.object.filter(id=1).update(name='jasonNB')

models.User.object.filter(id=4).delete( )

7、orm外键关联

一对多
外键字段在多的一方

publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)

多对多
外键字段可以 直接写在某张表中 ORM会自动帮你创建第三张表

authors = models.ManyToManyField(to='Authors')

一对一
外键字段建在铲鲟频率较搞得表中

datail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)

作业:

views

def Userinfo(request):
    if request.method=='GET':
        if request.GET.get('us')=='create':
            return render(request,'create_info.html')
        if request.GET.get('us')=='delete':
            id = request.GET.get('id')
            models.UserInfo.objects.filter(id=id).delete()
            return redirect('http://127.0.0.1:8000/userinfo/')
        if request.GET.get('us')=='update':
            user_dict=request.GET
            return render(request,'update.html',{'user_dict':user_dict})
        # print(request.GET)
        userinfo = models.UserInfo.objects.filter()
        print(userinfo)
        return render(request,'user_info.html',{'userinfo':userinfo})
    #添加信息
    elif request.method == 'POST':
        if request.GET.get('us')=='update':
            id=request.GET.get('id')
            username = request.POST.get('name')
            password = request.POST.get('pwd')
            models.UserInfo.objects.filter(id=id).update(name=username,pwd=password)
            return redirect('http://127.0.0.1:8000/userinfo/')
        username=request.POST.get('name')
        password=request.POST.get('pwd')
        res=models.UserInfo.objects.create(name=username,pwd=password)
        print(res)
        return redirect('http://127.0.0.1:8000/userinfo/')

user_info.html

<body>
<div class="container">
    <div class="row">
    <h1 class="text-center">用户信息</h1>
        <button class="btn"><a href="http://127.0.0.1:8000/userinfo/?us=create">添加信息</a></button>
        <table class="table table-bordered">
            <thead>
                <tr class="info">
                    <th>编号</th>
                    <th>用户名</th>
                    <th>密码</th>
                    <th><a >添加信息</a></th>
                </tr>
            </thead>

            <tbody>
                {% for user_object in userinfo %}
                <tr class="danger">
                    <td>{{ user_object.id }}</td>
                    <td>{{ user_object.name }}</td>
                    <td>{{ user_object.pwd }}</td>
                    <td><a href="http://127.0.0.1:8000/userinfo/?us=update&id={{ user_object.id }}&name={{ user_object.name }}&pwd={{ user_object.pwd }}">编辑</a> <a href="http://127.0.0.1:8000/userinfo/?us=delete&id={{ user_object.id }}">删除</a></td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
</div>
</body>

create_info.html

<body>
    <div class="container">
        <div class="row">
            <h1 class="text-center">添加信息</h1>
            <form action="http://127.0.0.1:8000/userinfo/" method="post">
                <p>用户名:<input type="text" class="form-control" name="name"></p>
                <p>密码:<input type="password" name="pwd" class="form-control"></p>
            <input type="submit" class="btn btn-info btn-block">
            </form>
        </div>
    </div>
</body>

update.html

<body>
    <div class="container">
        <div class="row">
             <h1 class="text-center">编辑信息</h1>
            <form action="http://127.0.0.1:8000/userinfo/?us=update&id={{ user_dict.id }}" method="post">
                <p>用户名:<input type="text" class="form-control" name="name" value="{{ user_dict.name }}"></p>
                <p>密码:<input type="password" name="pwd" class="form-control" value="{{ user_dict.pwd }}"></p>
            <input type="submit" class="btn btn-info btn-block">
            </form>
        </div>
    </div>
</body>

在这里插入图片描述

相关文章:

  • 深度学习中的激活函数有哪些?
  • Image through Atmospheric Turbulence笔记(一)
  • 遇到的一些奇怪的bug(非代码问题)与解决方法
  • 鸟哥私房菜linux就该这么学-学习记录
  • 猿创征文| Mybatis报错原因和解决方法:Invalid bound statement (not found): com.xxx.mapper.xxx
  • 算法学习-单调栈,接雨水经典题目
  • 2.Dos命令
  • 操作系统复习:进程
  • 经典/最新计算机视觉论文及代码推荐
  • python搞笑表白
  • Mycat的概述及MySQL主从复制部署安装
  • 江汉大学计算机考研资料汇总
  • iOS 小组件 widget 编辑小组件
  • Allegro Design Entry HDL(OrCAD Capture HDL)工具栏管理详细介绍
  • 计算机网络笔记(王道考研) 第五章:传输层
  • 分享的文章《人生如棋》
  • Android 控件背景颜色处理
  • const let
  • Docker: 容器互访的三种方式
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • js递归,无限分级树形折叠菜单
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • React-生命周期杂记
  • SpriteKit 技巧之添加背景图片
  • webpack入门学习手记(二)
  • 从setTimeout-setInterval看JS线程
  • 飞驰在Mesos的涡轮引擎上
  • 如何解决微信端直接跳WAP端
  • 进程与线程(三)——进程/线程间通信
  • 如何正确理解,内页权重高于首页?
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​flutter 代码混淆
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #NOIP 2014#Day.2 T3 解方程
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言)二分查找 超详细
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (算法)前K大的和
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)Neo4j下载安装以及初次使用
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET CLR基本术语
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET 发展历程
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET的微型Web框架 Nancy
  • ::前边啥也没有
  • :中兴通讯为何成功
  • [2544]最短路 (两种算法)(HDU)
  • [Android]常见的数据传递方式