MySQL----python操作数据库练习
一、多对多的正反向查询
class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名") course = models.CharField(verbose_name="课程",max_length=32) def __str__(self): return self.name class Teacher(models.Model): name = models.CharField(max_length=23,verbose_name="姓名") classes = models.ManyToManyField(verbose_name="所属班级",to="Class") def __str__(self): return self.name
题目1:查找小明[老师]所带的班级
# 方式一:基于对象的查找
models.Teacher.objects.filter(name="小明").first().classes.all()
models.Teacher.objects.filter(name="小明").first().classes.values("name")
# 方式二:基于双下划线的查找 models.Teacher.objects.filter(name="小明").values("classes__name")
注意:要说明的是多对多的查询用.all,,查单个的时候用.values或者values_list,不要用obj.classes.name,,这样查到的会是None,反向查询也是如此。
总结:不管是一对多,还是多对多,要是查询多得一方就得用all()
表结构
from django.db import models # Create your models here. # 一个学生有一个班级,一个班级可以有好多学生,所以是 # 一对多的关系,关联字段放在多的一方 class Student(models.Model): name = models.CharField(max_length=32,verbose_name="姓名") age = models.IntegerField(verbose_name="年龄") classes = models.ForeignKey(to="Class",verbose_name="所属班级") def __str__(self): return self.name class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名") course = models.CharField(verbose_name="课程",max_length=32) def __str__(self): return self.name class Teacher(models.Model): name = models.CharField(max_length=23,verbose_name="姓名") classes = models.ManyToManyField(verbose_name="所属班级",to="Class") def __str__(self): return self.name
查询乐乐[同学]在那个班级
# 方式一: print("乐乐[同学]所在的班级",models.Student.objects.filter(name="海燕").values("classes__name")) # 方式二: obj_cls = models.Student.objects.filter(name="海燕").first() print("乐乐[同学]所在的班级",obj_cls.classes.name)
查询乐乐[同学]所在班的老师的姓名(双表)
models.Student.objects.filter(name="乐乐").values("classes__teacher__name")
查询python班的所有学生的姓名
models.Class.objects.filter(name="python").values("student__name")
models.Class.objects.filter(name="python").first().student_set.all().values("name")