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
删除id1的表记录
Teachers.objects.filter(id=1).delete()

  

1
2
3
4
5
修改所有数据的姓名为alex
Teachers.objects.all().update(name="alex")
 
修改id1的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表中id1的记录
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):就第三张表中加入一条数据,将班级id1的班级与老师id3的老师关联起来,
obj.n.add([4,5]):现在将id45的两位老师关联这个班级

 

1
2
3
4
删除:
obj.n.remove(3):解除id1的班级与id3的老师的记录
 
obj.n.remove([4,5]):解除id1的班级与id45的老师的记录

  

1
2
清空:
obj.n.clean():解除id1的班级和所有关联老师的记录

  

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是一个对象集合,获取另一个表的与id2的班级关联老师的所有对象
[老师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
获取id2的老师对象
obj=models.Teachers.objects.filter(id=2).first()
 
给老师分配一个班级
obj_set.add(2)
 
另外一种方法:
releated_name="sssss"
obj.sssss.add(2)
 
注意:
给老师只分配12班级,如果有别的关系则删除,如果存在关系则保留,没有关系则创建。
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()中使用
外键名__外表字段

  

 

posted @   -零  阅读(309)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示