models.py文件
1 from django.db import models 2 3 # Create your models here. 4 5 class Classes(models.Model): 6 """ 7 班级表 8 """ 9 name = models.CharField(max_length=32) 10 m = models.ManyToManyField("Teachers") 11 12 class Teachers(models.Model): 13 """ 14 老师表 15 """ 16 name = models.CharField(max_length=32) 17 18 class Student(models.Model): 19 username = models.CharField(max_length=32) 20 age = models.IntegerField() 21 gender = models.BooleanField() 22 cs = models.ForeignKey(Classes)
单表操作
1 ################# 单表操作 ################# 2 # 增 3 # 方法一 4 Teachers.objects.create(name='root') 5 # 方法二 6 obj = Teachers(name='root') 7 obj.save() 8 # 查 9 Teachers.objects.all() #全部对象 10 Teachers.objects.filter(id=1) 11 Teachers.objects.filter(id=1,name='root') 12 result = Teachers.objects.filter(id__gt=1) 13 # 上面获得的都是 QuerySet [obj(id,name),obj(id,name)] 14 result = Teachers.objects.filter(id__gt=1).first() 15 # 上面获得QuerySet中的第一个对象 16 # 删 17 Teachers.objects.filter(id=1).delete() 18 # 改 19 Teachers.objects.all().update(name='lao') 20 Teachers.objects.filter(id=1).update(name='lao')
一对多
1 ################# 一对多 #################### 2 # 增 3 # 第一种方法 4 Student.objects.create(username='lao',age=18,gender=True,cs_id=1) 5 # 第二种方法 6 cs = Classes.objects.filter(id=1).first() 7 Student.objects.create(username='lao',age=18,gender=True,cs=cs) 8 # 查 9 ret = Student.objects.all() 10 # [obj(),obj(),obj()] 11 # 每个对象可以得到以下信息: 12 for item in ret: 13 print(item.username) 14 print(item.age) 15 print(item.gender) 16 print(item.cs_id) 17 print(item.cs) 18 print(item.cs.name) 19 print(item.cs.id) 20 # 删 21 Student.objects.filter(id=1).delete() 22 Student.objects.filter(username='lao').delete() 23 Student.objects.filter(cs_id=1).delete() 24 # 练习:删除一个班级的学生 25 cid = input('请输入班级ID:') 26 Student.objects.filter(cs_id=cid).delete() 27 cname = input('请输入班级名称') 28 # Student.objects.filter(cs.name=cname).delete() #错误的写法 29 Student.objects.filter(cs__name=cname).delete() #字段+双下划线
多对多
1 # 直接建立 2 class Classes(models.Model): 3 """ 4 班级表 5 """ 6 name = models.CharField(max_length=32) 7 m = models.ManyToManyField("Teachers") 8 9 # 外键方式建立第三张表 10 class C2T(models.Model): 11 cid = models.ForeignKey(Classes) 12 tid = models.ForeignKey(Teachers)
1 ##################### 多对多 ########################### 2 # 增 3 obj = Classes.objects.filter(id=1).first() 4 obj.m.add(2) #增加班级 id=1 老师id=2 5 obj.m.add([3,4]) #增加多个 6 7 obj = Classes.objects.filter(id=2).first() 8 obj.m.add(2) 9 obj.m.add([3,4]) 10 # obj.m代表第三张表,可以通过这个对表进行操作 11 # 删除 12 obj = Classes.objects.filter(id=1).first() 13 obj.m.remove([3,4]) 14 # 清空 15 obj.m.clear() #清空班级ID为1对应的所有老师 16 # 重置 17 obj.m.set([2,3,5]) #更新班级id=1 列表中的老师id 18 # 查 19 # 练习:把三班的所有老师列举出来 20 obj = Classes.objects.filter(id=1).first() 21 ret = obj.m.all() 22 # ret是一个[老师1(id,name),老师2(id,name)]的格式
数据库获取数据的类型
-[obj,obj] ------------ all filter
-[{},{}] ------------------ values
-[(),()]------------------- values_list
1 stu_list1 = Student.objects.all() 2 # [obj,obj,obj,obj] #对象 3 stu_list2 = Student.objects.all().values("id","username") 4 # [{"id":1,"username":"xx"},{"id":2,"username":"oo"}] #字典 5 stu_list3 = Student.objects.all().values_list("id","username") 6 # [(1,"xx"),(2,"oo")] #元组 7 stu_list4 = Student.objects.all().values("id","cs__name") 8 for row in stu_list4: 9 print(row["username"],row["cs__name"])
三表外键关联
1 class School(models.Model): 2 """ 3 校区 4 """ 5 name = mdoels.CharField(max_length=32) 6 7 class Classes(models.Model): 8 """ 9 班级表 10 """ 11 name = models.CharField(max_length=32) 12 bs = models.ForeignKey(School) 13 14 class Student(models.Model): 15 username = models.CharField(max_length=32) 16 age = models.IntegerField() 17 gender = models.BooleanField() 18 cs = models.ForeignKey(Classes,related_name="ssss") # cs是classes的一个对象(name,bs(bs是school的一个对象(name))) 19 #可以通过字段+ 双下划线跨表获取数据 20 stu_list = Student.objects.all().values("username","cs__name","cs__bs__name")
正向和反向(一对多)
-找到3班的所有学生 # 正向查找 Student.objects.filter(cs__name="3班") # 反向查找 obj = Classes.objects.filter(name="3班").first() obj.student_set.all() #Classes类 隐含的字段: 类名_set 类为当前Classes相关联的类
正向和反向(多对多)
1 cls_list = models.Classes.objects.all() 2 for obj in cls_list: 3 print(obj.id,obj.name,obj.m) 4 for row in obj.m.all(): 5 print('---',row.name) 6 7 obj = models.Classes.objects.filter(id=1).first() 8 obj.m.add(3) #班级id=1 老师id=3 9 10 obj = models.Teachers.objects.filter(id=2).first() 11 # obj.classes_set.add(3) #老师id=2 班级id=3 12 obj.sssss.add(3) #老师id=2 班级id=3 13 14 obj = models.Teachers.objects.filter(id=2).first() 15 obj.sssss.set([1,2]) #如果没变,则不删除修改
注意:
1 v = models.Classes.objects.all().values("id","name","m","m__name") 2 print(v) 3 for item in v: 4 print(type(item)) 重要:item是字典,不能继续.m访问一下 5 t = models.Teachers.objects.all().values("name","sssss__name")
总结:
1 # 1.类代表数据库表 2 # 2.类的对象代指数据库的一行记录 3 # 3.FK字段代指关联表中的一列数据(__跨表) 4 # 4. 5 -正向:fk字段 #推荐 6 -反向:小写类名_set(默认) #一般不进行反向操作 7 - cs = models.ForeignKey(Classes,related_name="ssss") #related_name 可以设置反向查找的默认名称 8 - obj.ssss.all() 9 10 #5.谁是主表?就全部列出其数据 11 #以下两个拿到的数据是否一样 12 Student.objects.all().values("username","cs__name") #学生是主表 13 QuerySet[{}] 14 Classes.objects.all().values("name","ssss__username") #班级是主表 ,班级没有学生照样都列出来,只是None 15 例如: 16 ret = Classes.objects.all().values("id","name","ssss","ssss__username") 17 print(ret) # 一个班级 对应多个学生,因为班级是主表(类似于SQL left join),所以对应几个学生,显示多少次班级,4班,没有对应则ssss=None 18 #[{'id':1,"name":"2班","ssss":1,"ssss_username":"laowang"},{'id':1,"name":"2班","ssss":3,"ssss_username":"maozong"}........] 19 20 # 4.M2M字段,自动生成第三张表,依赖关联表对第三张表间接操作