django--ORM表的多对一关系

打印 上一主题 下一主题

主题 898|帖子 898|积分 2694


  • 多对一关系是什么
Django使用django.db.models.ForeignKey定义多对一关系。
ForeignKey需要一个位置参数:与该模型关联的类
  1.  class Info(models.Model):<br>       user = models.ForeignKey(other_model,on_delete=models.SET_NULL)
复制代码
生活中的多对一关系:班主任,班级关系。一个班主任可以带很多班级,但是每个班级只能有一个班主任
  1.  from django.db import models<br> # id  name  gender  定义老师的模型类<br> class Teacher(models.Model):<br>     name = models.CharField(max_length=30,verbose_name="老师姓名")<br>     gender = models.CharField(max_length=10,verbose_name="老师性别")<br>     class Meta:<br>         db_table = "teachers"<br>     def __str__(self):<br>         return self.name<br> # id name gender score teacher_id<br> class Student(models.Model):<br>     name = models.CharField(max_length=20,verbose_name="学生姓名")<br>     gender = models.CharField(max_length=10,verbose_name="学生性别")<br>     score = models.IntegerField(verbose_name="学生分数")<br>     # to:后边写所关联的模型类  <br>     # on_delete=models.CASCADE:主表中数据删除,从表也删除<br>     # 外键关联的是整个模型类,不是单独的某一个对象<br>     # 但是通过模型类会产生一个相关联的字段  字段名_id<br>     teacher = models.ForeignKey(to=Teacher,on_delete=models.CASCADE,verbose_name="所属老师")<br>     class Meta:<br>         db_table = "students"<br>     def __str__(self):<br>         return self.name
复制代码

  • 多对一关系的增删改操作
  1.  添加老师语法:<br>     模型类.objects.create()<br>     Teacher.objects.create(name="王老师",gender="女")<br> 删除老师语法:<br>     模型类.objects.get(条件).delete()<br>     # 删除id为2的老师<br>     Teacher.objects.get(id=2).delete()  # (3, {'myapp.Student': 2, 'myapp.Teacher': 1})                                <br>   # 3代表一共删除的数据个数  Student删除3条 Teacher删除1<br> 修改老师语法:<br>     模型类.objects.filter(条件).update()<br>     # 修改id为3的老师性别为女<br>     Teacher.objects.filter(id=3).update(gender="女")
复制代码
以上创建了两条老师数据 由于我们设置外键关联可以为空null=True,所以此时在班级表创建时,可以直接保存,不需要提供老师数据
  1.  添加学生语法:<br>     模型类.objects.create()<br>     通过外键_id的形式来添加<br>         Student.objects.create(name="李四",gender="男",score=80,teacher_id=3)<br>     直接给外键赋值一个老师对象<br>         t1 = Teacher.objects.create(name="李老师",gender="男")<br>         Student.objects.create(name="李四",gender="男",score=80,teacher=t1)<br> 删除学生语法:<br>     模型类.objects.get(条件).delete()<br>     Student.objects.get(id=1).delete()<br> 修改学生语法:<br>     模型类.objects.filter(条件).update(字段1,字段2...)<br>     Student.objects.get(id=1).update(name="张三")
复制代码
注意要记得删除之后要重新获取一次数据,否则查看到的结果中还是之前获取到的有老师的班级数据

  • 多对一的正向查询
将老师分配个班级之后,由于班级表关联了老师字段,我们可以通过班级找到对应老师 虽然老师表中没有关联班级字段,
但是也可以通过老师找到他所带的班级,这种查询方式也叫作关联查询
  1.  # 查询id为2的学生的老师姓名<br>     --找到id为2的学生<br>     stu = Student.objects.get(id=2)<br>     --找到stu对应的老师    stu.teacher.name<br>     stu.外键.name
复制代码

  • 多对一的反向查询
通过模型类名称后追加一个_set,来实现反向查询
  1.  反向查询:通过django的内置属性来进行查询  模型类(模型类小写)_set()可以反向查询老师名下的所有学生,<br>     # 查询id为1的老师的所有学生    --先找到id为1的老师    <br>     tea = Teacher.objects.get(id=1)    <br>     --查询tea老师名下的所有学生  老师对象.模型类_set.all()    <br>     tea.student_set.all()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表