单表操作
增加
方法一:(推荐使用)
Teachers.objects.create(name='root')
方法二:
obj = Teachers(name='root') obj.save()
查
#查询Teacher表的所有 Teachers.objects.all() #查询Teacher表id=1 Teachers.objects.filter(id=1) #查询Teacher表id=1且name=root Teachers.objects.filter(id=1,name='root') #查询Teacher表id大于1的 result = Teachers.objects.filter(id__gt=1).first()
删除
Teachers.objects.filter(id=1).delete()
改
#修改所有记录的name为alex Teachers.objects.all().update(name='alex') #修改id=1的记录的name为alex Teachers.objects.filter(id=1).update(name='alex')
一对多操作
增
#创建一条记录,外键=1 Student.objects.create(username='东北',age=18,gender='男',cs_id=1) #创建一条记录,外键=查询后的结果(明显不推荐) Student.objects.create(username='东北',age=18,gender='男',cs= Classes.objects.filter(id=1).first() )
删
#删除id=1的 Student.objects.filter(id=1).delete() # 删除外键=1的所有 Student.objects.filter(cs_id=1).delete() #根据用户输入的外键进行删除所有跟外键相关的 cid = input('请输入班级ID') Student.objects.filter(cs_id=cid).delete() #根据用户输入的班级名称,通过外键删除所有跟名称相同的 cname = input('请输入班级名称') Student.objects.filter(cs__name=cname).delete()
查
ret = Student.objects.all() # [] # [ obj(..),] # [ obj(1 东北 18 男 1),obj(2 东北1 118 男 2),obj(..),] for item in ret:
#本表格内的列 print(item.id) print(item.username) print(item.age) print(item.gender)
#本表格的外键 print(item.cs_id)
#外键关联表格 print(item.cs.id) print(item.cs.name)
查询方式不一样,得到的结果不一样,都是QuerSet
stu_list = Student.objects.all()
#相当于SQL语句
select * from tb;
#得到的是一个一个对象组成的列表
[obj,obj,obj,obj]
stu_list = Student.objects.all().values("id",'username')
#相当于SQL语句
select id,username from tb;
#得到的是一个一个字典组成的列表
[{"id":1,'username':'xx'},{id:'',username:''}]
stu_list = Student.objects.all().values_list("id",'username')
#得到的是一个一个元组组成的列表
[(1,'root'), (2,'alex')]
查询三班的所有学生
#跨表查询,通过foreignkey加双下划线
Student.objects.filter(cs__name='3班')
obj = Classes.objects.filter(name='3班').first()
查询所有学生的姓名以及其所在的班级名称
stu_list = Student.objects.all().values('username',"cs__name")
#可以针对这个列表进行for循环
for row in stu_list:
#对字典进行循环,取出值
print(row['username'],row['cs__name'])
查询学生姓名及班级及学校(foreignkey连续跳转)
stu_list = Student.objects.all().values('username',"cs__titile",“cs__fk__name”)
针对外键的正向查询,是通过有外键的表格进行查询
ret = models.Students.objects.filter(cs__title='我们东北') print(ret) #打印结果: #<QuerySet [<Students: Students object (3)>, <Students: Students object (4)>]>
针对外键的反向查询,是通过外键关联的表格进行查询,表面上表格没有关联字段,实际上有一个隐含的关联字段,名称是有外键的表格的“类名_set”(注意要小写)
obj = models.Classes.objects.filter(title='我们东北').first() print(obj.students_set.all()) #打印结果:(结果与正向查询的结果一致) #<QuerySet [<Students: Students object (3)>, <Students: Students object (4)>]>
设置外键的时候,可以设置related_name='ssss'。此时就在主表中可以使用ssss作为外键使用
ret = models.Classes.objects.all().values('id','title','ssss') print(ret) #结果是所有class的数据,并多了students的外键的值 ret = models.Classes.objects.all().values('id','title','ssss__username') print(ret) #结果是所有class的数据,并多了students表的username的值
谁是主表?得到的内容不同
ret = models.Student.objects.all().values('username', 'cs__titile') ret1 = models.Classes.objects.all().values('titile', 'ssss__username') ret: <QuerySet [{'username': '张三', 'cs__title': '全栈1班'}, {'username': '王五', 'cs__title': '我们东北'}, {'username': '333', 'cs__title': '我们东北'}]> ret1: <QuerySet [{'title': '全栈1班', 'ssss__username': '张三'}, {'title': '全栈2班', 'ssss__username': None}, {'title': '我们东北', 'ssss__username': '王五'}, {'title': '我们东北', 'ssss__username': '333'}]> #可以看到,此时谁作为主表进行查询时,将谁全部列出,关联表没有值的时候返回None
多对多操作
增
# 首先筛选出需要增加的班级,形成一个对象 obj = Classes.objects.filter(id=1).first() #通过操作对象的多对多的属性,一条一条增加 obj.m.add(2) #通过操作对象的多对多的属性,按列表方式增加 obj.m.add([4,3])
# 注意插入时必须对应有这个id,否则会报错 # 正向插入 obj = models.Classes.objects.filter(id=1).first() obj.m.add(3) # 反向插入 obj = models.Teachers.objects.filter(id=2).first() #通过设置 表名_set 的方式,可以进行反向添加 obj.classes_set.add(5)
可以在多对多表格设置的时候增加related_name='sssss',这样在反向的时候,就可以使用这个名字
#moudels.py
class Classes(models.Model): # 班级表 title = models.CharField(max_length=32) # 建立多对多的表关系。多对多的表关系,放在哪个表都可以,对原表没有影响 m = models.ManyToManyField('Teachers', related_name='sssss')
#views.py
obj = models.Teachers.objects.filter(id=2).first()
obj.sssss.add(5)
删
#通过筛选后的对象,操作多对多的表格,进行删除 obj.m.remove(2) obj.m.remove([4,3]) #通过筛选后的对象,操作多对多的表格,进行清空 obj.m.clear()
改(重置)
#通过筛选后的对象,操作多对多的表格,设置值为2,3,5 obj.m.set([2,3,5])
查
# 查第三张表 # 把3班的所有老师列举 obj = Classes.objects.filter(id=1).frist() # ret是一个 [ 老师1(id,name),obj(id,name) ] ret = obj.m.all() # 第三张表