models简略总结

发布时间 2023-12-06 17:34:56作者: 木屐呀

 

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字段,自动生成第三张表,依赖关联表对第三张表间接操作