Django 中 ORM 单表操作,增删改查
一、mysql 配置
# 1.安装扩展
pip install pymysql
# 2.settings.py 中修改数据库配置
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'runoob', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
# 3. 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()
二、定义模型
- Django 规定,如果要使用模型,必须要创建一个 app。
django-admin startapp app
- 修改 django_project/app/models.py 文件代码:
# models.py
from django.db import models # 包含了定义模型所需的所有工具
class User(models.Model): # 在数据库中创建一个对应的表
name = models.CharField(max_length=20)
# 用于定义对象的字符串表示形式 (控制当对象被转换为字符串时,应该返回什么样的内容)
def __str__(self):
return self.name
# user = models.User.objects.get(id=24)
# 加上这个方法:返回:'py1'(id=24的name值)
# 不加返回:User object (24)
- 在 setting.py 中 INSTALLED_APPS 中添加新建的app
INSTALLED_APPS = (
...
'app', # 添加此项
)
- 执行如下命令,创建表结构
python3 manage.py makemigrations app # 让 Django 知道我们在我们的模型有一些变更
python3 manage.py migrate app # 创建表结构
如果没有设置主键,Django 会自动添加一个 id 作为主键。
三、增删改查
1. 添加数据
from app import models
def add_user(request):
# 方法1:模型类实例化对象(返回值为None )
user = models.User(name='python',age=18).save()
# 方法2:通过 ORM 提供的 objects 提供的方法 create 来实现(推荐:返回值为 User object 可以通过 user.id 获取自增id值)
user = models.User.objects.create(name='python',age=18)
2. 查询数据
from app import models
def userList(request):
# 获取所有数据
response = models.User.objects.all() # 返回 QuerySet 类型
# 设置条件过滤
response = models.User.objects.filter(id=1) # 返回 QuerySet 类型
response = models.User.objects.filter(pk=1) # 都是返回主键为1的数据
# exclude返回不满足条件的值
response = models.User.objects.exclude(id=1)
# 获取单个对象
response = models.User.objects.get(id=1) # 如果符合筛选条件的对象 超过了一个或者没有一个都会抛出错误
# 限制返回的数据
response = models.User.objects.order_by('name')[0:2]
# order_by('name') 升序排列
# order_by('-name') 降序排列
models.User.objects.all().order_by('age').reverse() # 将输出的结果反转,通常用于在已经排序的结果上进行反向排序
models.User.objects.all().count() # 查询所有数据量 返回值为 int
models.User.objects.all().first() # 返回所有数据的第一条数据 返回值为对象
models.User.objects.all().last() # 返回所有数据的最后一条数据 返回值为对象
models.User.objects.filter(pk=1).exists() # 判断返回的 QuerySet 是否为空 返回值:True False
user = models.User.objects.values("id","name","age") # 用于查询部分字段的数据 返回是一个可迭代的字典序列
print(user[0]) 输出: {'id': 24, 'name': 'py', 'age': 102}
user = models.User.objects.values_list("id","name","age") # 返回值:一个个元组,元组里放的是查询字段对应的数据
print(user[0]) 输出: (24, 'py', 102)
user = models.User.objects.values_list("name").distinct() # 数据去重 一般是联合 values 或者 values_list 使用
#filter() 方法基于双下划线的模糊查询(exclude 同理)
models.User.objects.filter(age__gt=100) # 查询年龄大于100的数据
models.User.objects.filter(age__gte=100) # # 查询年龄等于100的数据
models.User.objects.filter(age__lt=100) # 查询年龄小于100的数据
models.User.objects.filter(age__lte=100) # 查询年龄小于100的数据
# 模糊查询
models.User.objects.filter(name__contains='py') # 包含
models.User.objects.filter(name__icontains='py') # 不区分大小写包含
models.User.objects.filter(name__startswith='p') # 以指定字符开头
models.User.objects.filter(name__endswith='1') # 以指定字符结尾
models.User.objects.filter(created_at__year=2024) # 年月日查询
models.User.objects.filter(created_at__month=10)
models.User.objects.filter(created_at__day=01)
3. 修改数据
from app import models
def userUpdate(request):
# 方法1 模型类的对象.save() 返回值:None
user = models.User.objects.filter(id=22).first()
user.age = 100
user.save()
# 方式2:QuerySet 类型数据.update(字段名=更改的数据)(推荐) #返回值为 int 影响行数
models.User.objects.filter(id=1).update(name='golang')
4. 删除数据
from app import models
def userDel(request):
# 方法1:使用模型类的对象.delete() 返回值:元祖,第一个元素为受影响的行数。(1, {'api.User': 1})(删除不存在的数据会报错)
user = models.User.objects.filter(pk=8).first().delete()