一对多关系
-------------------models.py---------------- from django.db import models class Classes(models.Model): # 班级表 title = models.CharField(max_length=32) m = models.ManyToManyField(‘Teachers‘) # 多对多 class Teachers(models.Model): # 老师表 name = models.CharField(max_length=32) class Student(models.Model): # 学生表 username = models.CharField(max_length=32) age = models.IntegerField() gender = models.BooleanField() cs = models.ForeignKey("Classes",on_delete=models.CASCADE) #cs是Classes的一个对象
表中的数据:
Classes Student
示例:
-查询所有学生的名称以及其所在班级的名称,QuerySet
stu_list = Student.objects.all() # [obj,obj,ibj,obj] 里面是一个一个的对象 stu_list = Student.objects.all().values(‘id‘,‘username‘) # [{‘id‘:1,‘username‘:‘xx‘},{‘id‘:‘‘,‘username‘:‘‘}...] 里面是字典 stu_list = Student.objects.all().values_list(‘id‘,‘username‘) [(1,‘小王‘),(2,‘小明‘)...] # 里面是元组 # 正解 stu_list = Student.objects.all().values(‘username‘,‘cs__title‘)
# <QuerySet [{‘username‘: ‘小王‘, ‘cs__title‘: ‘2班‘}, {‘username‘: ‘小明‘, ‘cs__title‘: ‘2班‘}, {‘username‘: ‘小刘‘, ‘cs__title‘: ‘2班‘}, {‘username‘: ‘小李‘, ‘cs__title‘: ‘3班‘}]> for row in stu_list: # 里面元素是字典 print(row[‘username‘],row[‘cs__title‘])
这里的跨表操作只是跨了两张表,跨三张表也一样的道理,例如,假如还有一张校区表School(有字段name),Classes表
中的另一个字段sch是外键,依赖于校区表,那么,找到所有学生的姓名、班级、校区则是:
stu_list = Student.objects.all().values(‘username‘,‘cs__title‘,‘cs__title__name‘)
正反向查询(通过双下划线跨表查询)
# 找到2班的学生 # -----正向----- a=models.Student.objects.filter(cs__title=‘2班‘) # 3个Student对象 print(a) # 正向查 # <QuerySet [<Student: Student object (1)>, <Student: Student object (2)>, <Student: Student object (3)>]> #------反向------ obj = models.Classes.objects.filter(title=‘2班‘).first() print(obj.student_set.all()) # 反向查
# <QuerySet [<Student: Student object (1)>, <Student: Student object (2)>, <Student: Student object (3)>]
总结:
1、类代表数据库的表
2、类的对象代指数据库的一行记录
3、ForeignKey(外键)字段代指关联表中的一行数据(类的对象)
4、ManyToManyField字段,自动生成第三张表,依赖关联表对第三张表间接操作
5、 -正向:cs字段 (推荐使用)
-反向:小写类名_set(还有一个 .all()方法,返回所有对象) 默认是这个名字,但也可以修改,
Student表的外键中有一个 related_name= 参数,可换成想要的名字。反向查只需
小写类名_set换成修改好的名字即可,
原文:https://www.cnblogs.com/zq8421/p/10386538.html