Django ORM数据库操作实战:从建表到增删改查
本文详细介绍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学习或工作有所帮助。如有任何疑问,欢迎留言交流,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













