""" 一般是已知学生, 查学校, 所以外键在学生方创建 """# vim models.pyclassPerson(models.Model):id= models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField(max_length=3)
school = models.ForeignKey(to="School", on_delete=models.CASCADE)# 级联删除, 2.0后需要手动指出, 1.11默认为此设置classSchool(models.Model):
name = models.CharField(max_length=32)
# 得到一个QuerySet
qs = models.Person.objects.all()# 使用 "外键字段__查询字段"
ret = qs.values_list("school__name")
基于对象的反向查询
# 找到id为2的学校
school_obj = models.School.objects.get(id=2)# 学校.查询表名_set
ret = school_obj.person_set.all()
基于QuerySet的反向查询(双下划线反向查询)
# 得到QuerySet
qs = models.School.objects.filter(id=1)# 使用 "查询表__查询字段"
ret = qs.values_list("book__name")
多对多
一个人可以会很多种语言, 一种语言也有很多人会
"多对多的关系"
表结构
class Person(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
school = models.ForeignKey(to="School", on_delete=models.CASCADE)
language = models.ManyToManyField(to="Language", related_name='ooo')
class School(models.Model):
name = models.CharField(max_length=32)
class Language(models.Model):
name = models.CharField(max_length=32)
多对多查询
基于对象的正向查询
# 获取正向查询对象
person_obj = models.Person.objects.first()# 对象.多对多的字段, 结果为QuerySet
data = person_obj.language
# 再使用values()/values_list()/all()处理QuerySet
ret = data.values_list('name')
ret = data.all()
基于QuerySet的正向查询
# 获取QuerySet
data = models.Person.objects.filter(id=1)# 处理QuerySet, "查询表__查询字段"
ret = data.values('language__name')
基于对象的反向查询
# 获取反向查询对象
language_obj = models.Language.objects.last()# 对象.表名_set, 结果为QuerySet
ret = language_obj.person_set
# 如果models中设置了related_name属性(related_name设定为ooo)
ret = language_obj.ooo
# 最后使用values()/values_list()/all()做处理
ret = data.values_list('name')
ret = data.all()
基于QuerySet的反向查询
# 获取QuerySet
data = models.Language.objects.filter(id=1)# 处理QuerySet, "related_name__查询字段"
ret = data.values('ooo__name')