目录标题

  • ORM系统的分析
  • Django的映射关系
  • 数据库的配置
  • Django模型类的使用


ORM系统的分析

1.ORM概念:对象关系映射(Object Relational Mapping,简称ORM)
2.ORM的优势:不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。

Django的映射关系

django 与 mysql的兼容版本 django和mysql交互_django

  1. 模型类必须都写在app下的models.py文件中。
  2. 模型如果需要映射到数据库,所在的app必须被安装(注册).
  3. 一个数据表对应一个模型类,表中的字段,对应模型中的类属性。

数据库的配置

  1. 须在项目的settings.py文件中进行数据库的配置,需要将引擎换成mysql,同时需要在虚拟机中进行端口转发,将3306转3306。具体代码如下:
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': BASE_DIR / 'db.sqlite3',
        'ENGINE':'django.db.backends.mysql', #数据库引擎
        'NAME': 'dj27', #指定数据库
        'USER': 'admin',
        'PASSWORD':'qwe123',
        'HOST':'127.0.0.1', #本案例操作的是虚拟机ip
        'PORT': 3306,   #需要操作的数据库的端口

    }
}
  1. 也可以自己创建一个用户,创建一个管理员用户xxx账号,密码为 qwe123:
    CREATE USER ‘xxx’@‘%‘IDENTIFIED BY ‘qwe123’;
    给这个用户授予所有远程访问,这个用户主要用于管理整个数据库,备份,还原等操作。
    GRANT ALL ON . TO ‘xxx’@‘%’;
    使授权立即生效:
    FLUSH PRIVILEGES;
    3.考虑到需要用pymysql操作数据库,进入到虚拟机的终端交互界面进行下载(pip install pymysql),并在主目录文件中的__init__.py文件中进行导入。
import pymysql
pymysql.install_as_MySQLdb() #配置pymysql管理器

Django模型类的使用

  1. 在app下面的models.py中创建django的模型类。
from django.db import models

# Create your models here.
class User(models.Model): #模型类
    id = models.AutoField(primary_key=Ture) #主键,自增长,ID可以省略不写
    name = models.CharField(20) #字符串字段
    age = models.IntegerField() #整数字段
  1. 将模型类映射到数据库中,先执行 makemigrations model_test生成映射文件,然后执行migrate model_test提交到数据库,在虚拟机中查看映射成功的表格如下:
mysql> show tables
    -> ;
+-------------------+
| Tables_in_dj27    |
+-------------------+
| django_migrations |
| model_test_user   |
+-------------------+
2 rows in set (0.00 sec)

mysql> desc model_test_user;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | NO   |     | NULL    |                |
| age   | int         | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)

注意:如果想删除创建的表格,不要直接在虚拟机中进行删除,容易报错。而是将models.py中的模型类全部注释,然后重新重复上述步骤进行映射。
2. 对数据库进行增删改查的操作,为了更直观地进行前后端交互展示,首先编写了一个登录注册界面,如下所示
register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
</head>
<body>
<form action="{% url 'add_user' %}" method="post">
    {% csrf_token %}
    用户名: <input type="text" NAME="username">
    年 龄:<input type="text" NAME="age">
    <input type="submit" value="注册">
</form>
</body>
</html>

具体思路:首先在urls.py访问注册页面,渲染注册方法,然后在注册方法里面写了一个注册页面,通过表单进行提交给add_user,访问注册路由,并在此获取信息,最后传输给数据库。(注意还须在主项目的urls.py中分配子路由)相应的方法渲染文件如下,包括视图文件中的方法定义,路由渲染。
app文件下的urls.py文件

from django.urls import path
from . import views

urlpatterns = [
    path('register/',views.register),
    path('add_user/',views.add_user,name='add_user')  #配置好对应的路由,取名字方便获取
]

数据库的四种增加数据方法

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from model_test.models import User

def register(request):
    return render(request,'model_test/register.html')

def add_user(request):
    #方法1
    name = request.POST.get('username')
    age = request.POST.get('age')
    res = User(name=name,age=age)
    res.save() #保存数据
    #方法二
    bd = User()
    bd.name = name
    bd.age = age
    bd.save()
    #方法3
    User.objects.create(name=name,age=age)
    #方法4
    User.objects.get_or_create(name=name,age=age)
    return HttpResponse('添加成功')

用四种方法添加后在虚拟机展示效果如下:

mysql> select * from model_test_user;
+----+--------------+-----+--------+
| id | name         | age | city   |
+----+--------------+-----+--------+
|  1 | 墨染         |  16 | 长沙   |
|  2 | wg3134000060 |  16 | 长沙   |
|  3 | yyyy         |  20 | 长沙   |
|  4 | kkla         |  24 | 长沙   |
|  5 | kkkls        |  20 | 长沙   |
+----+--------------+-----+--------+

数据库的查询数据方法
all()和filter()方法返回的是QuerySet对象.
get()方式返回的单个对象,如果符合条件的对象有多个,则get报错!

def select_user(request):
    #查询所有数据
    res = User.objects.all()
    #查询单个数据
    res = User.objects.get(name = '墨染')
    #查询满足条件的数据
    res = User.objects.filter(name='墨染',age=16)
    print(res)
    return HttpResponse('查询完成')
  1. 从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet.
  2. QuerySet是可迭代对象.
  3. QuerySet支持切片, 不支持负索引.
  4. 可以用list强行将QuerySet变成列表.
    数据库的修改数据方法
def update(request):
    #方法1
    user = User.objects.get(id=2)
    user.name = 'xxx'
    user.age = 18
    user.save()
    return HttpResponse('数据修改完毕')
    #方法2
    User.objects.filter(id=1).update(age=67)

数据库的删除数据方法

def delete_user(request):
    User.objects.get(id=4).delete()
    User.objects.filter(id=2).delete()
    #全部删除
    User.objects.all().delete()
    return HttpResponse('删除完成')

**注意:**在实现以上方法的时候,记得在urls.py中添加路径。