Django数据库配置与ORM操作全指南--超级详细!
目录
一、Python操作MySQL基础
在Python中,我们可以使用pymysql模块直接操作MySQL数据库:
首先在python终端(alt+f12)中下载pymysql,
pip install pymysql
二、Django配置MySQL数据库连接
1.默认配置
Django默认使用SQLite数据库,但实际项目中更常使用MySQL。
2. 配置MySQL连接步骤
1.安装pymysql驱动
pip install pymysql
2.修改settings.py配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_qiku', # 数据库名称
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
'HOST': '127.0.0.1', # 数据库主机
'PORT': 3306, # 数据库端口
'OPTIONS': {
'charset': 'utf8mb4', # 建议设置字符集
}
}
}
3.添加pymysql兼容层
在项目__init__.py文件中添加:
import pymysql
pymysql.install_as_MySQLdb()

注意: 是有settings.py的项目中__init__.py,不要弄成其它文件的__init__
注意:对于Python 3.x,需要此步骤来替代MySQLdb
三、模型定义与数据库迁移
1. 创建用户模型
from django.db import models
class User(models.Model):
"""
用户模型类 --> 对应数据库表 tb_user
"""
username = models.CharField(max_length=20, null=False, verbose_name="用户名")
password = models.CharField(max_length=20, null=False, verbose_name="密码")
gender = models.IntegerField(null=True, default=0, verbose_name="性别")
age = models.IntegerField(null=True, verbose_name="年龄")
phone = models.CharField(max_length=20, null=True, verbose_name="电话")
email = models.EmailField(max_length=32, null=True, verbose_name="邮箱")
class Meta:
db_table = "tb_user" # 自定义表名
verbose_name = "用户" # 在admin界面显示的名称
verbose_name_plural = verbose_name # 复数形式
def __str__(self):
return self.username # 对象显示为用户名
2. 数据库迁移
1、生成迁移文件
python manage.py makemigrations
2、执行迁移
python manage.py migrate
提示:每次修改模型后都需要重新执行迁移操作
四、Django Shell操作数据库
启动Django Shell:
python manage.py shell
1. 添加数据
from book.models import User
# 方法1:创建对象后逐个赋值
user = User()
user.username = "admin"
user.password = "123456"
user.gender = 1
user.age = 20
user.phone = "111111111111"
user.email = "admin@qq.com"
user.save()
# 方法2:使用create方法
User.objects.create(
username="guest",
password="123456",
gender=0,
age=25,
phone="22222222222",
email="guest@qq.com"
)
2. 查询数据
# 查询所有记录
all_users = User.objects.all()
# 查询单条记录(不存在或有多条时会抛出异常)
user = User.objects.get(pk=1) # 主键查询
user = User.objects.get(id=1) # ID查询
user = User.objects.get(username='admin') # 条件查询
# 使用filter查询(返回QuerySet)
users = User.objects.filter(username='admin')
users = User.objects.filter(age__gt=18) # 年龄大于18
users = User.objects.filter(username__contains='ad') # 模糊查询 like '%ad%'
users = User.objects.filter(username__startswith='ad') # 以ad开头
users = User.objects.filter(username__endswith='min') # 以min结尾
# 排序
users = User.objects.all().order_by('-age') # 按年龄降序
3. 更新数据
user = User.objects.get(pk=1)
user.username = 'administrator'
user.save()
# 批量更新
User.objects.filter(age__lt=18).update(gender=0)
4. 删除数据
# 先查询再删除
user = User.objects.get(pk=2)
user.delete()
# 批量删除
User.objects.filter(age__gt=100).delete()
五、多表关联操作
1. 模型定义
class BookInfo(models.Model):
"""
图书信息表 tb_book
"""
bookName = models.CharField(max_length=20, null=False, verbose_name="图书名称")
author = models.CharField(max_length=20, null=False, verbose_name="作者")
price = models.FloatField(null=True, verbose_name="价格")
publishDate = models.DateTimeField(null=True, verbose_name="出版日期")
remark = models.CharField(max_length=512, verbose_name="备注")
class Meta:
db_table = "tb_book"
def __str__(self):
return self.bookName
class HeroInfo(models.Model):
"""
英雄信息表 tb_hero
"""
name = models.CharField(max_length=20, null=False, verbose_name="英雄名字")
gender = models.IntegerField(default=0, null=True, verbose_name="性别")
bookInfo = models.ForeignKey("BookInfo", on_delete=models.CASCADE, verbose_name="所属图书")
remark = models.CharField(max_length=512, null=True, verbose_name="备注")
class Meta:
db_table = "tb_hero"
def __str__(self):
return self.name
2. 关联操作
# 创建图书
book = BookInfo.objects.create(
bookName="射雕英雄传",
author="金庸",
price=45.8,
publishDate="1980-01-01"
)
# 创建关联英雄 - 方法1
hr = HeroInfo()
hr.name = '黄蓉'
hr.gender = 1
hr.bookInfo = book
hr.save()
# 创建关联英雄 - 方法2
HeroInfo.objects.create(
name="郭靖",
gender=0,
bookInfo=book
)
# 创建关联英雄 - 方法3(通过主表对象创建)
book.heroinfo_set.create(name='郭芙', gender=1)
# 查询图书的所有英雄
book = BookInfo.objects.get(pk=1)
heroes = book.heroinfo_set.all() # 获取所有关联英雄
# 查询英雄所属图书
hero = HeroInfo.objects.get(name='黄蓉')
related_book = hero.bookInfo # 获取关联的图书对象
六、高级查询技巧
1. 聚合查询
from django.db.models import Count, Avg, Max, Min, Sum
# 统计英雄数量
HeroInfo.objects.aggregate(total=Count('id'))
# 按性别分组统计
HeroInfo.objects.values('gender').annotate(count=Count('id'))
# 计算平均价格
BookInfo.objects.aggregate(avg_price=Avg('price'))
2. Q对象复杂查询
from django.db.models import Q
# 或条件查询
User.objects.filter(Q(age__gt=30) | Q(gender=1))
# 且条件查询
User.objects.filter(Q(username__contains='a') & Q(age__lt=40))
# 非条件查询
User.objects.filter(~Q(gender=1))
七、常见问题与解决方案
-
连接MySQL报错:
-
确保MySQL服务已启动
-
检查数据库用户权限
-
确认数据库已创建
-
-
迁移失败:
-
删除所有迁移文件(migrations目录下除__init__.py外的文件)
-
删除数据库中的django_migrations表记录
-
重新执行迁移
-
-
性能优化:
-
使用
select_related和prefetch_related减少查询次数 -
只查询需要的字段(使用
only和defer) -
批量操作使用
bulk_create和bulk_update
-
八、总结
本文详细介绍了Django中MySQL数据库的配置、模型定义、数据迁移以及通过ORM进行CRUD操作的方法。重点讲解了单表操作和多表关联操作,并提供了多种查询方式和高级技巧。掌握这些知识后,你将能够高效地在Django项目中操作数据库,构建复杂的数据关系模型。
建议在实际开发中结合Django Admin后台管理系统,可以更直观地管理和操作数据库数据。同时,对于复杂的查询需求,可以结合原生SQL和ORM混合使用,以达到最佳的性能和开发效率平衡。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)