Django中models模型(操作数据库)

  • ORM
    • 自己创建数据库
    • 连接数据库
    • Django操作表
    • 数据库操作
      • 新建
      • 删除
      • 获取数据
  • 实例:用户管理

Django开发操作数据库更简单,内部提供了ORM框架
ORM的流程
Django中models模型(操作数据库)_第1张图片

ORM

ORM,全称 Object Relational Mapping (对象关系映射),通过 ORM 我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性, ORM 在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
  • 模型类的每个属性都相当于一个数据库的字段。

使用 ORM 有许多优点

  • 易用性:使用 ORM 做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰。
  • 性能损耗小: ORM 转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少(不足5%),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处要远远大于性能损耗,而且项目越大作用越明显。
  • 设计灵活:可以轻松的写出复杂的查询。
  • 可移植性: Django 封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的 MySQL 、 PostgreSQL 和 SQLite ,可以非常轻松的切换数据库。

我们需要安装第三方模块

pip install mysqlclient

ORM可以帮助我们做两件事:

  • 创建、修改、删除数据库中的表(不用你写SQL语句)
  • 操作表中的数据(不用写SQL语句)

自己创建数据库

  • 启动MySQL服务
  • 自带工具创建数据库
create database 名称 default charset utf8 collate utf8_general_ci

连接数据库

在settings.py中DATABASES中修改

DATABASES = {
    'default' : {
        'ENGINE' : 'django.db.backends.mysql',
        'NAME' : 'dbname',
        'USER' : 'root',
        'PASSWORD' : '',
        'HOST' : '',
        'PORT' : '',
    }
}

Django操作表

models.py中创建类

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField()
python3 manage.py makemigrations
python3 manage.py migrate

注意:app需要提前注册
Django中models模型(操作数据库)_第2张图片
Django中models模型(操作数据库)_第3张图片
在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据:

  • 手动输入一个值
  • 设置默认值
age = models.IntegerField(default=2)
  • 允许为空
data = models.IntegerField(null=True,blank=True)

以后在开发中如果想要对表结构进行调整:

  • 在models.py文件中操作类即可
  • 命令
python3 manage.py makemigrations
python3 manage.py migrate

数据库操作

新建

表名.objects.create(字段="")

删除

使用delete()函数删除

表名.objects.filter(过滤条件).delete()  删除过滤条件
表名.objects.all().delete()   删除整个表

获取数据

all()函数整个表 获取的是QuerSet类型 [对象,对象,对象]

表名.objects.all()

获取第一条数据[对象]

表名.objects.filter(id=1).first()

更新数据

表名.objects.filter(id=2).update(age=999)
表名.objects.all().update(password=999)
表名.objects.filter(name="张三").update(age=999)

实例:用户管理

1.展示用户列表

  • url
  • 函数
    • 获取所有用户信息
    • HTML渲染

2.添加用户

  • url
  • 函数
    • GET,看到页面,输入内容
    • POST,提交->写到数据库

3.删除用户

  • url
  • GET拼接url

list.html列出用户信息

 #list.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
<h1>用户列表</h1>
<a href="/add/">用户添加</a>

<table border="1">
    <thead>
    <tr>
        <th>id</th>
        <th>姓名</th>
        <th>密码</th>
        <th>年龄</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for obj in datelist %}
        <tr>
        <td>{{ obj.id }}</td>
        <td>{{ obj.name }}</td>
        <td>{{ obj.password }}</td>
        <td>{{ obj.age }}</td>
        <td>
            <a href="http://127.0.0.1:8000/delete/?nid={{ obj.id }}">删除</a>
        </td>
        </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>

add.html添加用户页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加用户</title>
</head>
<body>
<h1>用户添加</h1>
<form method="post">
    {% csrf_token %}
    <input type="text" name="user" placeholder="用户名">
    <input type="password" name="pwd" placeholder="密码">
    <input type="text" name="age" placeholder="年龄">
    <input type="submit" value="提交">
</form>
</body>
</html>

用户信息视图函数

def list(request):
    date_list = UserInfo.objects.all()

    return render(request,'list.html',{"datelist":date_list})

添加用户用户视图函数

def add(request):

    if request.method == "GET":
        return render(request,'add.html')
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    age = request.POST.get("age")

    UserInfo.objects.create(name=user,password=pwd,age=age)

    return redirect("/list/")

删除用户视图函数

def delete(request):
    nid = request.GET.get('nid')
    UserInfo.objects.filter(id=nid).delete()

    return redirect("http://127.0.0.1:8000/list")

用户添加

Django中models模型(操作数据库)_第4张图片
用户列表

Django中models模型(操作数据库)_第5张图片
点击删除用户信息后

Django中models模型(操作数据库)_第6张图片

人生漫漫其修远兮,网安无止境。
一同前行,加油!

你可能感兴趣的:(Django,django,数据库,python,web开发,web框架)