Django 模型

Django 模型

Django 对各种数据库提供了统一调用的API,这里以MySQL为例作为介绍。

首先需要安装pymysql以在Python中支持MySQL

pip install pymysql

数据库统一调用原理 —— Django ORM

Django模型使用对象关系映射(Object Relational Mapping,ORM)用于实现面向对象编程中不同类型系统的数据之间的转换。

ROM在业务逻辑和数据库层之间充当了桥梁的作用,通过使用描述对象和数据库之间的映射元数据,将程序中的对象自动持久化到数据库中

  • 使用ORM的好处:
    • 提高开发效率
    • 不同数据库可以平滑切换
  • 缺点:
    • ORM代码转换为SQL语句时,需要花费一定的时间,执行效率会有所降低
    • 长期写ORM代码,会降低SQL语句编写的能力

解析过程

  • 首先,ORM会将Python代码转换为SQL语句
  • SQL语句通过pymysql传送到数据库服务端
  • 在数据库中执行SQL语句并将结果返回

ORM对应关系表

数据库配置

ORM无法操作到数据库级别,只能操作到数据表,所以我们需要先自己创建一个数据库,这里我创建了一个名为testdb的数据库

修改settings.py中的DATABASES配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 使用 MySQL 数据库
        'NAME': 'webdb', # 数据库名称
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '1234',  # 数据库密码
        'HOST': 'localhost',  # 数据库主机
        'PORT': '3306',  # 数据库端口
        'OPTIONS': {
            'charset': 'utf8mb4',  # 使用 utf8mb4 字符集
        }
    }
}

接着需要告诉Django使用pymysql模块链接mysql数据库,在与settings.py同级目录下的__init__.py中引入模块,并配置

# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置 
import pymysql
pymysql.install_as_MySQLdb()

定义模型

创建APP

Django规定,如果要使用模型,必须创建一个App。在Django中,“APP”指的是一个具有特定功能的模块化组件,包括模型(Models)、视图(Views)、模板(Templates)和URL配置等。

Pycharm中选择新建Python软件包 命名为TestModel

再创建一个models.py文件 创建一个User对象继承自models.Model

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=20) # CharField 相当于 VARCHAR(20)

settings.py文件中找到INSTALLED_APPS,将我们创建的APP TestModel 加入进去

INSTALLED_APPS = [
    'django.contrib.admin', # 管理员后台
    'django.contrib.auth',  # 认证系统
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',    # 静态文件处理
    'TestModel',
]

打开命令行,移动到项目目录下,注意进入到Django的环境

python manage.py migrate   # 创建表结构

运行以上指令创建数据库表结构,运行成功后,在数据库中会出现Django默认的一些表

执行以下指令,让Django知道我们的模型有了变更

python manage.py makemigrations TestModel

执行以下指令创建表结构

python manage.py migrate TestModel

此时在数据库中,可以看见我们创建的表testmodel_user,表名的组成结构为:应用名_类名

数据库操作

添加数据

修改urls.py文件,增加一个添加数据的接口

from django.urls import path
from TestModel import views

urlpatterns = [
    path('', views.test),
    path('testAdd/', views.testAdd),
]

views.py中增加数据的函数

from django.shortcuts import render
from TestModel.models import User

def test(request):
    context = {}
    context['hello'] = 'Hello World!'
    return render(request, 'test.html', context)

def testAdd(request):
    test1 = User(name = "test1")
    test1.save()
    return render(request, 'test.html', {'db': '数据添加成功!'})

修改一下页面显示test.html

<h1>{{ hello }}</h1>

{% if db %}
<h1>{{ db }}</h1>
{% endif %}

运行项目,查看效果:

打开原链接时,仍显示之前的界面

输入testAdd路由,成功显示出db变量的内容,说明添加成功

在数据库中查看

成功添加了一个名为test1的用户。

获取数据

views.py中添加testGetAll接口

def testGetAll(request):
    users = User.objects.all()  # 获取所有用户
    context = {'users': users}
    return render(request, 'test.html', context)

urls.py中添加路径

path('testGetAll/', views.testGetAll),

test.html中添加查询到的列表

path('testGetAll/', views.testGetAll),

打开链接查看结果

上述代码中使用了User.object.all()方法获取了所有数据,相当于select * from testmodel_user,还可以通过其他一些条件获取数据

函数 描述
User.objects.filter(id=1) filter相当于SQL中的where,可以设置条件过滤结果
User.object.sget(id=1) 获取单个对象
User.objects.order_by("id") 根据id排序
User.objects.order_by("name")[0,2] 从第0行开始,输出2行数据,相当于SQL中的offset 0 limit 2

更新数据

修改数据可以使用save()updata()

views.py增加接口:

def testUpdate(request, id):
    try:
        user = User.objects.get(id=id)  # 根据 ID 获取用户
        user.name = "李四"  # 更新用户名称
        user.save()  # 保存更改
        context = {'message': "更新成功"}
    except User.DoesNotExist:
        context = {'message': 'User not found'}
    return render(request, 'test.html', context)

urls.py中增加路由:

path('testUpdate/<int:id>/', views.testUpdate),

test.html中增加message信息显示

{% if message %}
    <h2>{{ message }}</h2>
{% endif %}

删除数据

删除数据库中的对象,只需调用该对象的delete()方法即可

def testDelete(request, id):
    try:
        user = User.objects.get(id=id)  # 根据 ID 获取用户
        user.delete()  # 删除用户
        context = {'message': "删除成功"}
    except User.DoesNotExist:
        context = {'message': 'User not found'}
    return render(request, 'test.html', context)

urls.py中增加路由:

path('testDelete/<int:id>/', views.testDelete),
  • 其他删除方法
    • 删除所有数据User.objects.all().delete()
    • 删除符合条件的数据User.objects.filter(id=1).delete()
posted @ 2025-06-17 13:39  风陵南  阅读(28)  评论(0)    收藏  举报