Django之ORM操作总结
Django之ORM总结
表结构
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')
单表操作
增加数据的两种方式: 第一种: Teachers.objects.create(name="root") 第二种: obj=Teachers(name="root") obj.save()
删除id为1的表记录 Teachers.objects.filter(id=1).delete()
修改所有数据的姓名为alex Teachers.objects.all().update(name="alex") 修改id为1的name为alex Teachers.objects.filter(id=1).update(name="alex")
获取所有的数据 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")
一对多操作
班级 id title 1 2班 2 3班 学生 id username age gender cs_id 1 小明 20 True 1
查看(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)
注意:cs_id为字段名,cs为对象。
删除: 删除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。
多对多操作
首先我们要明白: 建立多对多关系可以两张表的随便哪张表都行。 默认在表里是不显示这个字段的。 建立多对多关系默认会创建第三张表,不需要手动创建。 对第三张表的操作还是通过建立多对多关系的对象来操作。
班级: 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
增加: 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的两位老师关联这个班级
删除: obj.n.remove(3):解除id为1的班级与id为3的老师的记录 obj.n.remove([4,5]):解除id为1的班级与id为4,5的老师的记录
清空: obj.n.clean():解除id为1的班级和所有关联老师的记录
重置: obj.n.set([2,3,5]):先解除所有与obj对象关联的对象,然后重新设置关联
#把三班的所有老师列举出来: obj =Classes.objects.filter(id=2).first() [id,title] ret=obj.n.all() ret是一个对象集合,获取另一个表的与id为2的班级关联老师的所有对象 [老师1(id,name...),老师2(id,name...),...] 注意:我们想要获取的不是第三张表(关系表)的数据,想要获取的是关联表的数据。
正向操作
获取每个班级的对象(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)
反向操作
获取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')
示例:所有学生的姓名以及所在班级名称
stu_list =Student.objects.all() #select * from table; for student in stu_list: student.name student.cs.title [obj,obj,obj,...]
stu_list =Student.objects.all().value("name","cs__title")
stu_list =Student.objects.all().value_list("name","cs__title") for student in stu_list: student['name'] student['cs__title'] [("name":零,"title":3班),("name":零,"":)]
找到三班的所有学生: Student.objects.filter(cs__name="3班")
总结: ORM通过类来操作数据库表。 一个类对应一张数据库的表。 通过类实例化出来的对象表达表中的一条记录。 类的属性为表中的字段。 其中外键代表关联表中的一行记录(对象)。 外键是一个对象,通过这个对象就可以调用关联表的字段。 注意:filter(),all(),get()等获取的都是一个对象集合, {对象1{属性1,属性2},对象2{属性1,属性2}....} 对象调用本表内的字段: 对象.本表字段 对象调用外表的字段: 外键名.外表字段 而在filter,get,all,values()中使用 外键名__外表字段