【Django-03】模型常用的增删改查

Django Model 增删改查函数

java 复制代码
class Grade(models.Model):
    id = models.AutoField(verbose_name='自增id', name="id", primary_key=True)
    grade_name = models.CharField(verbose_name="班级名称", name="grade_name", max_length=200)
    age = Models.IntField()
    create_time = models.DateTimeField(verbose_name='创建时间',name="create_time", auto_now_add=True)  # 第一次赋值
    update_time = models.DateTimeField(verbose_name='最后一次更新时间',name="update_time", auto_now=True)  # 第二次赋值
    class Meta:
        db_table = "app_grade"
        ordering=["-update_time","create_time"]

QuerySet 对象

表示查询集,是从数据库中获取到的Model集合,集合中每个元素都是我们的Model对象

all()

python 复制代码
queryset=Grade.objects.all()
for grade in queryset:
	print(grade.crade_name)

filter()

类似于sql中的where

python 复制代码
queryset=Grade.objects.filter(grade_name ='三班')
for grade in queryset:
	print(grade.crade_name)

get()

返回符合要求的一条数据,只返回一条,当未找到数据或者是返回的数据超过一条都会抛出异常,因此需要做异常捕捉处理。一般查询条件用主键id,这唯一对应一条数据。

python 复制代码
grade=Grade.objects.get(id=1)
print(grade.crade_name)

exclude()

排除符合条件的值

python 复制代码
grade=Grade.objects.exclude(grade_name ='三班')
for grade in queryset:
	print(grade.crade_name)

values()

指定返回的列,相当于 select grade_name create_time from student.

返回的对象包含的数据类型是 指定表列的字典dict结构,所以代码中取值略有不同

python 复制代码
grade=Grade.objects.values('grade_name','create_name')
for grade in queryset:
	print(grade["crade_name"])

distinct()

一般结合values用

python 复制代码
grade=Grade.objects.values('grade_name').distinct()
for grade in queryset:
	print(grade["crade_name"])

支持的表达式

上面的查询都是用的 '=' ,其实还支持的表达式有:

__gt

__gte

__lt

__lte

__in

__contains

__year

__month

__day

组合使用

一些基础的组合是可以链式调用的,不必那么死板。

python 复制代码
grade=Grade.objects.filter(id__in=(1,3,4)).filter(name__contains='张')
for grade in queryset:
	print(grade.name)

创建数据

save和create都行

python 复制代码
grade=Grade()
grade.grade_name='四班'
grade.save()
 #  或者
 grade = {"grade_name": '四班'}
 Grade.objects.create(**grade)

更新数据

可以用save或者update函数。 逻辑很简单:先查出来数据,再对查出来的对象修改之后再保存进去即可。

  1. 基础写法

    python 复制代码
    grade=Grade.objects.get(id=1)
    grade.grade_name='四班'
    grade.save()
  2. 链式写法

    python 复制代码
    grade=Grade.objects.get(id=1).update(garde_name='四班')
  3. 批量更新

    python 复制代码
    grade=Grade.objects.update(garde_name='四班')

删除数据

  1. 删除单行

    python 复制代码
    grade = Grade.objects.get(id=1)
    grade.delete()
  2. 删除多行

    python 复制代码
    d = Grade.objects.filter(garde__contains='四').delete()
    print(d)
  3. 删除全部

    python 复制代码
    d = Grade.objects.all().delete()

如果删除的数据中有外键,且on_delete 参数值为 CASCADE 则外键关联 主表 中的数据也会被删除

F()函数

python 复制代码
grade = Grade.objects().all()
grade.age+=1
grade.save()

上面的语句实际的执行流程是:先从数据库查出来放在内存,赋予新的值后再更新到数据库。 改成下面的样式

python 复制代码
	grade = Grade.objects().all()
	grade.age=F(age)+1
	grade.save()
	grade.refresh_from_db()#必须执行此处的刷新才能生效
	

实际执行流程是,直接在数据库执行update, 减少一次查询操作

Q()函数

用于执行多个where条件。 用起来比较方便,代码啥的也比较简洁,推荐使用

Grade.objects().filter(Q(grade_name='三班')&Q(age__gt=30))

相关推荐
IvorySQL14 小时前
PostgreSQL 技术日报 (3月6日)|为什么 Ctrl-C 在 psql 里让人不安?
数据库·postgresql·开源
NineData15 小时前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
IvorySQL20 小时前
PostgreSQL 技术日报 (3月5日)|规划器控制力升级,内核能力再进阶
数据库·postgresql·开源
数据组小组1 天前
免费数据库管理工具深度横评:NineData 社区版、Bytebase 社区版、Archery,2026 年开发者该选哪个?
数据库·测试·数据库管理工具·数据复制·迁移工具·ninedata社区版·naivicat平替
程序设计实验室2 天前
分享一些2026年有意思的现代化Django生态组件
django
悟空聊架构2 天前
基于KaiwuDB在游乐场“刷卡+投币”双模消费系统中的落地实践
数据库·后端·架构
IvorySQL2 天前
PostgreSQL 技术日报 (3月4日)|硬核干货 + 内核暗流一网打尽
数据库·postgresql·开源
进击的丸子2 天前
虹软人脸服务器版SDK(Linux/ARM Pro)多线程调用及性能优化
linux·数据库·后端
NineData2 天前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析