• 多对一关系是什么

Django使用django.db.models.ForeignKey定义多对一关系。

ForeignKey需要一个位置参数:与该模型关联的类

 class Info(models.Model):
       user = models.ForeignKey(other_model,on_delete=models.SET_NULL)

生活中的多对一关系:班主任,班级关系。一个班主任可以带很多班级,但是每个班级只能有一个班主任

 from django.db import models
 # id name gender 定义老师的模型类
 class Teacher(models.Model):
     name = models.CharField(max_length=30,verbose_name="老师姓名")
     gender = models.CharField(max_length=10,verbose_name="老师性别")
     class Meta:
         db_table = "teachers"
     def __str__(self):
         return self.name
 # id name gender score teacher_id
 class Student(models.Model):
     name = models.CharField(max_length=20,verbose_name="学生姓名")
     gender = models.CharField(max_length=10,verbose_name="学生性别")
     score = models.IntegerField(verbose_name="学生分数")
     # to:后边写所关联的模型类  
     # on_delete=models.CASCADE:主表中数据删除,从表也删除
     # 外键关联的是整个模型类,不是单独的某一个对象
     # 但是通过模型类会产生一个相关联的字段 字段名_id
     teacher = models.ForeignKey(to=Teacher,on_delete=models.CASCADE,verbose_name="所属老师")
     class Meta:
         db_table = "students"
     def __str__(self):
         return self.name
  • 多对一关系的增删改操作

 添加老师语法:
  模型类.objects.create()
     Teacher.objects.create(name="王老师",gender="女")
 删除老师语法:
  模型类.objects.get(条件).delete()
  # 删除id为2的老师
  Teacher.objects.get(id=2).delete()  # (3, {'myapp.Student': 2, 'myapp.Teacher': 1})
   # 3代表一共删除的数据个数 Student删除3条 Teacher删除1
 修改老师语法:
     模型类.objects.filter(条件).update()
  # 修改id为3的老师性别为女
  Teacher.objects.filter(id=3).update(gender="女")

以上创建了两条老师数据 由于我们设置外键关联可以为空null=True,所以此时在班级表创建时,可以直接保存,不需要提供老师数据

 添加学生语法:
     模型类.objects.create()
  通过外键_id的形式来添加
  Student.objects.create(name="李四",gender="男",score=80,teacher_id=3)
  直接给外键赋值一个老师对象
  t1 = Teacher.objects.create(name="李老师",gender="男")
  Student.objects.create(name="李四",gender="男",score=80,teacher=t1)
 删除学生语法:
  模型类.objects.get(条件).delete()
     Student.objects.get(id=1).delete()
 修改学生语法:
     模型类.objects.filter(条件).update(字段1,字段2...)
     Student.objects.get(id=1).update(name="张三")

注意要记得删除之后要重新获取一次数据,否则查看到的结果中还是之前获取到的有老师的班级数据

  • 多对一的正向查询

将老师分配个班级之后,由于班级表关联了老师字段,我们可以通过班级找到对应老师 虽然老师表中没有关联班级字段,

但是也可以通过老师找到他所带的班级,这种查询方式也叫作关联查询

 # 查询id为2的学生的老师姓名
  --找到id为2的学生
     stu = Student.objects.get(id=2)
     --找到stu对应的老师    stu.teacher.name
     stu.外键.name
  • 多对一的反向查询

通过模型类名称后追加一个_set,来实现反向查询

 反向查询:通过django的内置属性来进行查询  模型类(模型类小写)_set()可以反向查询老师名下的所有学生,
     # 查询id为1的老师的所有学生   --先找到id为1的老师    
     tea = Teacher.objects.get(id=1)    
     --查询tea老师名下的所有学生  老师对象.模型类_set.all()    
     tea.student_set.all()

django--ORM表的多对一关系的更多相关文章

  1. Django 一对多,多对多关系解析

    [转]Django 一对多,多对多关系解析   Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 :        一对一: OneToOneField         ...

  2. django之分页器、多对多关系、form校验组件

    批量插入数据 bulk_create # 1.往书籍表中插入数据 1000 # for i in range(1000): # 这种插入方式 效率极低 # models.Book.objects.cr ...

  3. 数据库表间多对多关系(附带额外字段)的实体类(POJO 或 POCO)表示

    介绍 在之前的 Entity Framework 快速上手介绍 之中,两个实体之间只是简单的一对一关系,而在实际的应用场景中,还会出现多对多关系,同时还有可能会出现多对多关系还附带有其他字段的情况. ...

  4. Django --- ORM表查询

    目录 使用数据库之前的配置工作 单表操作常用的方法 一对多字段的增删改查 多对多字段数据的增删改查 跨表查询 聚合函数 分组查询 F与Q查询 使用数据库之前的配置工作 settings.py中的配置 ...

  5. 【mysql】如何通过navicat配置表与表的多对一关系,一对一关系?设计外键的效果

    背景: 现在要将接口自动化测试结果持久化,当前只是每次运行接口测试,将测试结果通过邮件发送给项目组成员.邮件内容如下: 表设计: 为了呈现这个结果:我设计了2张表run_result和run_deta ...

  6. Django 的ORM 表间操作

    Django之ORM表间操作   之前完成了简单的数据库数据增加操作.这次学习更多的表间操作. 单表操作 增加 方式一 b = Book(title="Python基础", pub ...

  7. Django ORM 实现数据的多表 增删改查

    一.创建模型和表 假定下面这些概念.字段与关系: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,手机号,家庭住址信息. 作者详情模型 和 作者模型之间是一对一的关系(one- ...

  8. django -- 多对多关系的实现

    在django中表和表之间的多对多关系有两种实现方案: 方案一:直接使用django自动实现的多对多关系. 方案二:自己写连接表.然而告诉django在实现多对多关系时要使用的连接表. 一.方案一: ...

  9. EF Codefirst 多对多关系 操作中间表的 增删改查(CRUD)

    前言 此文章只是为了给新手程序员,和经验不多的程序员,在学习ef和lambada表达式的过程中可能遇到的问题. 本次使用订单表和员工表建立多对多关系. 首先是订单表: public class Ord ...

随机推荐

  1. 一行代码让你的项目轻松使用Dapr

    介绍 Dapr简化了云原生开发,让开发可以把焦点放在应用的业务逻辑上,从而让代码简单.可移植,那作为一个.Net开发者,我们也希望项目可以快速用上dapr,那究竟应该如何做呢? Dapr提出了Side ...

  2. 一种O(n)时间复杂度的计数排序算法和Top N热词算法

    排序算法是研究非常广泛且超级经典的算法,主流排序算法的时间复杂度基本都在O(nlogn). 今天就介绍一种以hash表为基础的,时间复杂度能够达到O(n)的排序算法--计数排序: 同时基于它的思想,完 ...

  3. 如何用C/C++实现去除字符串头和尾指定的字符

    编程时我们经常需要对字符串进行操作,其中有一项操作就是去除字符串的头(尾)指定的字符,比如空格.通常我们会使用封装好的库函数或者类函数的Trim方法来实现,如果自己动手写一个TrimHead和Trim ...

  4. python3 获取函数变量

    Python 3.8可以使用f字符串调试功能: 1 test_dict = {1: "1", 2: "2", 3: "3"} 2 print ...

  5. Idea使用入门

    jeecgboot推荐使用的idea是2019,原使用的2017在自动识别maven项目上有点问题,甚至2019在一些报错下仍然可以直接运行项目     idea的安装结构(卸载细节涉及) 下载文件位 ...

  6. 团队Arpha5

    队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 服务器网络 ...

  7. 为 ASP.NET Core (6.0)服务应用添加ApiKey验证支持

    这个代码段演示了如何为一个ASP.NET Core项目中添加Apikey验证支持. 首先,通过下面的代码创建项目 dotnet new webapi -minimal -o yourwebapi 然后 ...

  8. 图解BM(Boyer-Moore)字符串匹配算法+代码实现

    简介 本篇文章主要分为两个大的部分,第一部分通过图解的方式讲解BM算法,第二部分则代码实现一个简易的BM算法. 基本概念 bm是一个字符串匹配算法,有实验统计,该算法是著名kmp算法性能的3-4倍,其 ...

  9. SSO 方案演进

    背景介绍 随着业务与技术的发展,现今比以往任何时候都更需要单点登录 SSO 身份验证. 现在几乎每个网站都需要某种形式的身份验证才能访问其功能和内容. 随着网站和服务数量的增加,集中登录系统已成为一种 ...

  10. Windows 程序安装与更新方案: Clowd.Squirrel

    我的Notion Clowd.Squirrel Squirrel.Windows 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装和更新. Squirrel.W ...