Day 56 Django 连接数据库 ORM

Day 56 Django 连接数据库 ORM

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 makemigrations
    
  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>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值