Django ORM 单表操作

发布于:2025-04-18 ⋅ 阅读:(24) ⋅ 点赞:(0)

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()

二、定义模型

  1. Django 规定,如果要使用模型,必须要创建一个 app。
django-admin startapp app
  1. 修改 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)
  1. 在 setting.py 中 INSTALLED_APPS 中添加新建的app
INSTALLED_APPS = (
   	...
    'app',               # 添加此项
)
  1. 执行如下命令,创建表结构
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()
	

网站公告

今日签到

点亮在社区的每一天
去签到