Django之ORM操作总结
Django之ORM总结
表结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | from django.db import models # 一对多:班级与学生 # 多对多:班级与老师 # Create your models here. #创建班级表 class Classes(models.Model): title = models.CharField(max_length = 32 ) n = models.ManyToManyField( 'Teachers' ,related_name = "sssss" ) #创建老师表 class Teachers(models.Model): name = models.CharField(max_length = 32 ) age = models.IntegerField(default = 30 ) gender = models.BooleanField(default = False ) is_married = models.BooleanField(default = True ) address = models.CharField(max_length = 50 ,default = 'xiaogan' ) # #创建第三张关系表 # class C2T(models.Model): # cid = models.ForeignKey(Classes) # tid = models.ForeignKey(Teachers) #创建学生表 class Student(models.Model): username = models.CharField(max_length = 32 ) age = models.IntegerField() #只能写true和false gender = models.BooleanField() cs = models.ForeignKey(Classes,on_delete = models.DO_NOTHING) address = models.CharField(max_length = 50 ,default = 'xiaogan' ) |
单表操作
1 2 3 4 5 6 7 8 | 增加数据的两种方式: 第一种: Teachers.objects.create(name = "root" ) 第二种: obj = Teachers(name = "root" ) obj.save() |
1 2 | 删除 id 为 1 的表记录 Teachers.objects. filter ( id = 1 ).delete() |
1 2 3 4 5 | 修改所有数据的姓名为alex Teachers.objects. all ().update(name = "alex" ) 修改 id 为 1 的name为alex Teachers.objects. filter ( id = 1 ).update(name = "alex" ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 获取所有的数据 Teachers.objects. all () 获取第一行数据 Teachers.objects. all ().first() 获取倒数第一行的数据 Teachers.objects. all ().last() 获取 id = 1 的表记录 Teachers.objects. filter ( id = 1 ) 获取 id = 2 并且name = "root" 的表记录 Teachers = .objects. filter ( id = 2 ,name = "root" ) |
一对多操作
1 2 3 4 5 6 7 8 | 班级 id title 1 2 班 2 3 班 学生 id username age gender cs_id 1 小明 20 True 1 |
1 2 3 4 5 6 7 8 9 10 11 12 | 查看( all ()、 filter ()、values()等) ret = Student.objects. all () for item in ret: print (item. id ) print (item.username) print (item.age) print (item.gender) print (item.cs_id) #这里的cs为对象, print (item.cs. id ) print (item.cs.name) |
1 | 注意:cs_id为字段名,cs为对象。 |
1 2 3 4 5 6 7 8 9 10 11 | 删除: 删除Student表中 id 为 1 的记录 Student.objects. filter ( id = 1 ).delete() 删除cs_id为 1 的记录,这里为整个三班的学生 Student.objects. filter (cs_id = 1 ).delete() 或者 Student.objects. filter (cs__name = "3班" ).delete() 注意:这里在 filter 里面进行跨表操作不是cs.name,而是cs__name。 |
多对多操作
1 2 3 4 5 | 首先我们要明白: 建立多对多关系可以两张表的随便哪张表都行。 默认在表里是不显示这个字段的。 建立多对多关系默认会创建第三张表,不需要手动创建。 对第三张表的操作还是通过建立多对多关系的对象来操作。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 班级: id title 1 2 班 2 3 班 3 1 班 老师: id name age gender is_married 1 alex 35 True True 2 Tom 43 Ture True 3 小明 26 True False 老师关系表: id 班级 id 老师 id 1 2 1 2 1 1 3 1 2 4 3 3 |
1 2 3 4 5 6 7 8 | 增加: obj = Classes.objects. filter ( id = 1 ).first() obj.n.add( 3 ) obj:获取的是 2 班这个对象 obj.n.add( 3 ):就第三张表中加入一条数据,将班级 id 为 1 的班级与老师 id 为 3 的老师关联起来, obj.n.add([ 4 , 5 ]):现在将 id 为 4 和 5 的两位老师关联这个班级 |
1 2 3 4 | 删除: obj.n.remove( 3 ):解除 id 为 1 的班级与 id 为 3 的老师的记录 obj.n.remove([ 4 , 5 ]):解除 id 为 1 的班级与 id 为 4 , 5 的老师的记录 |
1 2 | 清空: obj.n.clean():解除 id 为 1 的班级和所有关联老师的记录 |
1 2 | 重置: obj.n. set ([ 2 , 3 , 5 ]):先解除所有与obj对象关联的对象,然后重新设置关联 |
1 2 3 4 5 6 7 8 | #把三班的所有老师列举出来: obj = Classes.objects. filter ( id = 2 ).first() [ id ,title] ret = obj.n. all () ret是一个对象集合,获取另一个表的与 id 为 2 的班级关联老师的所有对象 [老师 1 ( id ,name...),老师 2 ( id ,name...),...] 注意:我们想要获取的不是第三张表(关系表)的数据,想要获取的是关联表的数据。 |
正向操作
1 2 3 4 5 6 7 8 9 10 11 12 | 获取每个班级的对象( id ,班级名字,任课老师) v = models.Classes. object . all ().values( 'id' , 'title' , 'n__name' ) 获取每个班级对象 cls_list = models.Classes.objects. all () for obj in cls_list: #每个班级id和名字 print (obj. id ,obj.title) #每个班级的所有任课老师 for row in obj.n. all (): print (row.name) |
反向操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 获取 id 为 2 的老师对象 obj = models.Teachers.objects. filter ( id = 2 ).first() 给老师分配一个班级 obj_set.add( 2 ) 另外一种方法: releated_name = "sssss" obj.sssss.add( 2 ) 注意: 给老师只分配 1 , 2 班级,如果有别的关系则删除,如果存在关系则保留,没有关系则创建。 obj.sssss. set ([ 1 , 2 ]) 通过第三张表查询关联表的内容 v = models.Teachers. object . all ().values( 'name' , 'sssss_title' ) |
示例:所有学生的姓名以及所在班级名称
1 2 3 4 5 6 | stu_list = Student.objects. all () #select * from table; for student in stu_list: student.name student.cs.title [obj,obj,obj,...] |
1 | stu_list = Student.objects. all ().value( "name" , "cs__title" ) |
1 2 3 4 5 | stu_list = Student.objects. all ().value_list( "name" , "cs__title" ) for student in stu_list: student[ 'name' ] student[ 'cs__title' ] [( "name" :零, "title" : 3 班),( "name" :零,"":)] |
1 2 | 找到三班的所有学生: Student.objects. filter (cs__name = "3班" ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 总结: ORM通过类来操作数据库表。 一个类对应一张数据库的表。 通过类实例化出来的对象表达表中的一条记录。 类的属性为表中的字段。 其中外键代表关联表中的一行记录(对象)。 外键是一个对象,通过这个对象就可以调用关联表的字段。 注意: filter (), all (),get()等获取的都是一个对象集合, {对象 1 {属性 1 ,属性 2 },对象 2 {属性 1 ,属性 2 }....} 对象调用本表内的字段: 对象.本表字段 对象调用外表的字段: 外键名.外表字段 而在 filter ,get, all ,values()中使用 外键名__外表字段 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?