Django ORM数据库操作实战:从建表到增删改查

南乔
南乔
发布时间:2026-10-13 | 3人浏览过
原创

本文详细介绍Django框架中使用ORM进行数据库操作的完整流程。涵盖Django项目的创建与配置、MySQL数据库连接设置、Model类定义及数据表生成。重点讲解通过views.py实现数据的增删改查操作,并列举常用查询筛选方法如大于、包含及判空等,帮助开发者快速掌握Django数据库交互技巧。

前言

Django作为功能强大的Python Web框架,在开发过程中不可避免地需要与数据库进行交互。虽然程序员熟悉SQL语法,但直接编写大量数据库语句并非开发重点。使用ORM(对象关系映射)来操作数据库能够显著提升效率。本文将演示如何利用ORM高效完成数据库操作。

一、创建Django项目

若使用PyCharm专业版,可直接通过图形界面快速创建项目。若使用非专业版或其他编辑器,则需通过命令行工具创建。以下是通过命令行创建项目的具体步骤:

django-admin startproject orm_test

执行上述命令后,当前目录下会生成一个名为orm_test的文件夹。随后进入该文件夹,并执行启动项目的命令:

python manage.py runserver

项目启动后,在默认浏览器中访问127.0.0.1:8000,若看到项目运行成功的提示页面,则说明项目已正常启动。

接下来,在项目内部创建一个应用(App),命令如下:

django-admin startapp cmdb

至此,项目的基础准备工作已完成。

二、修改配置文件

首先,需要将新建的应用(此处名为cmdb)添加到setting.py文件中的INSTALLED_APPS列表中,以便Django识别该应用:

INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'cmdb', #我们创建的应用
]

此外,虽然Django默认使用SQLite3数据库,但实际项目中通常使用MySQL。因此,需要在setting.py中找到DATABASES配置项,并将其修改为MySQL数据库的连接信息:

DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.mysql',
 'NAME': 'orm_test', #数据库名称
 'USER':'root', #用户
 'PASSWORD':'123456', #密码
 'HOST':'localhost', #IP地址,本地测试为localhost
 'PORT':'3306', #端口号
 }
}

上述配置中的“NAME”字段值应替换为数据库中已存在的数据库名称。配置完成后,需在该数据库中创建相应的数据表。

在Python 3环境中,连接MySQL数据库需使用pymysql库。因此,在项目同名文件夹下的__init__.py文件中添加以下代码,以确保数据库连接正常运行:

 import pymysql
 pymysql.install_as_MySQLdb()

三、定义模型类以创建表结构

在应用(cmdb)的models.py文件中编写表结构。我们需要定义一个类,类中的属性对应数据库表的列,ORM会将此类自动转换为SQL语句。以下是一个简单的示例,定义了包含用户名和密码两列的表:

from django.db import models

# Create your models here.

class users(models.Model):
 username=models.CharField(max_length=32)
 password=models.CharField(max_length=64)

四、生成数据表

在终端中执行命令python manage.py makemigrations,此时会在应用(cmdb)下的migrations文件夹中生成一个_initial.py文件,该文件记录了生成数据表结构的临时数据。接着,在命令行中执行python manage.py migrate,根据上述临时文件生成实际的数据表。在数据库中查看生成的数据表时,会发现Django不仅创建了自定义表,还生成了十多个内部使用的表(用于缓存、Cookie、Session等),这体现了框架的完备性。可在终端中通过show create table cmdb_users;命令查看表结构:


从结果可见,除了自定义的两个属性列外,还多出了一个自增的主键id列。

五、配置路由映射

在项目同名文件夹下的urls.py文件中,导入应用(cmdb)并配置URL映射关系至cmdb的views.py:

from django.conf.urls import url
from django.contrib import admin
from cmdb import views
urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^login/', views.login),
]

六、视图及数据表的增删改查

在路由映射指向的应用(cmdb)下的views.py文件中,编写对应的处理函数,例如login函数。为了验证项目运行状态,可先在函数中简单打印“Hello World”。

在login函数中编写具体的增删改查逻辑代码。

from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.

from cmdb import models
def login(request):
 #增加
 # models.users.objects.create(username='xsmile',password=12345)
 # models.users.objects.create(username='sofia',password=12345)
 # models.users.objects.create(username='jerry',password=12345)
 #查看
 # result=models.users.objects.all() #查看所有

 # 条件查询,结果为querySet类型,所以循环取出结果
 # result=models.users.objects.filter(username='sofia')
 # for row in result:
 # print(row.id,row.username,row.password)

 #更改
 # models.users.objects.filter(id=2).update(username='eric')
 
 #删除
 #models.users.objects.filter(username='sofia').delete()

 return HttpResponse('Hello World')

启动项目后,在浏览器中访问127.0.0.1:8000/login,若屏幕显示“Hello World”,则表明相关数据操作已成功修改数据表。执行相关操作后,数据表内容的变化如下:

#插入一条数据后
mysql> select * from cmdb_users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | xsmile | 12345 |
+----+----------+----------+
1 row in set (0.00 sec)

#再插入三条数据后
mysql> select * from cmdb_users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | xsmile | 12345 |
| 2 | xsmile | 12345 |
| 3 | sofia | 12345 |
| 4 | jerry | 12345 |
+----+----------+----------+
4 rows in set (0.00 sec)

#修改数据后
mysql> select * from cmdb_users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | xsmile | 12345 |
| 2 | eric | 12345 |
| 3 | sofia | 12345 |
| 4 | jerry | 12345 |
+----+----------+----------+
4 rows in set (0.00 sec)

#删除数据后
mysql> select * from cmdb_users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | xsmile | 12345 |
| 2 | eric | 12345 |
| 4 | jerry | 12345 |
+----+----------+----------+
3 rows in set (0.00 sec)

七、Django ORM常用查询筛选

以下列举Django ORM中常用的查询筛选方法:

  • 大于、大于等于
  • 小于、小于等于
  • in(包含于列表)
  • like(模糊匹配)
  • is null / is not null(判空)
  • 不等于/不包含于

模型定义示例:

class User(AbstractBaseUser, PermissionsMixin):
 uuid = ShortUUIDField(unique=True)
 username = models.CharField(max_length=100, db_index=True, unique=True, default='')
 schoolid = models.CharField(max_length=100, null=True, blank=True, default='')
 classid = models.CharField(max_length=100, null=True, blank=True, default='')
 fullname = models.CharField(max_length=50, default='', null=True, blank=True)
 email = models.EmailField(_('email address'), blank=True, null=True)
 age = models.SmallIntegerField(default=0)

大于、大于等于

__gt 大于
__gte 大于等于

User.objects.filter(age__gt=10) // 查询年龄大于10岁的用户
User.objects.filter(age__gte=10) // 查询年龄大于等于10岁的用户

小于、小于等于

__lt 小于
__lte 小于等于

User.objects.filter(age__lt=10)  // 查询年龄小于10岁的用户
User.objects.filter(age__lte=10) // 查询年龄小于等于10岁的用户

in(包含于列表)

__in

查询年龄在某一范围的用户
User.objects.filter(age__in=[10, 20, 30])

like(模糊匹配)

__exact    精确等于 like 'aaa'
__iexact    精确等于 忽略大小写 ilike 'aaa'
__contains   包含 like '%aaa%'
__icontains  包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。

is null / is not null(判空)

__isnull 判空

User.objects.filter(username__isnull=True)  // 查询用户名为空的用户
User.objects.filter(username__isnull=False) // 查询用户名不为空的用户

不等于/不包含于

User.objects.filter().excute(age=10)  // 查询年龄不为10的用户
User.objects.filter().excute(age__in=[10, 20]) // 查询年龄不为在 [10, 20] 的用户

总结

以上就是本文的全部内容,希望这些内容对大家的Python学习或工作有所帮助。如有任何疑问,欢迎留言交流,感谢支持。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表