django--ORM表的多对一关系
多对一关系是什么
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表的多对一关系的更多相关文章
- Django 一对多,多对多关系解析
[转]Django 一对多,多对多关系解析 Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 : 一对一: OneToOneField ...
- django之分页器、多对多关系、form校验组件
批量插入数据 bulk_create # 1.往书籍表中插入数据 1000 # for i in range(1000): # 这种插入方式 效率极低 # models.Book.objects.cr ...
- 数据库表间多对多关系(附带额外字段)的实体类(POJO 或 POCO)表示
介绍 在之前的 Entity Framework 快速上手介绍 之中,两个实体之间只是简单的一对一关系,而在实际的应用场景中,还会出现多对多关系,同时还有可能会出现多对多关系还附带有其他字段的情况. ...
- Django --- ORM表查询
目录 使用数据库之前的配置工作 单表操作常用的方法 一对多字段的增删改查 多对多字段数据的增删改查 跨表查询 聚合函数 分组查询 F与Q查询 使用数据库之前的配置工作 settings.py中的配置 ...
- 【mysql】如何通过navicat配置表与表的多对一关系,一对一关系?设计外键的效果
背景: 现在要将接口自动化测试结果持久化,当前只是每次运行接口测试,将测试结果通过邮件发送给项目组成员.邮件内容如下: 表设计: 为了呈现这个结果:我设计了2张表run_result和run_deta ...
- Django 的ORM 表间操作
Django之ORM表间操作 之前完成了简单的数据库数据增加操作.这次学习更多的表间操作. 单表操作 增加 方式一 b = Book(title="Python基础", pub ...
- Django ORM 实现数据的多表 增删改查
一.创建模型和表 假定下面这些概念.字段与关系: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,手机号,家庭住址信息. 作者详情模型 和 作者模型之间是一对一的关系(one- ...
- django -- 多对多关系的实现
在django中表和表之间的多对多关系有两种实现方案: 方案一:直接使用django自动实现的多对多关系. 方案二:自己写连接表.然而告诉django在实现多对多关系时要使用的连接表. 一.方案一: ...
- EF Codefirst 多对多关系 操作中间表的 增删改查(CRUD)
前言 此文章只是为了给新手程序员,和经验不多的程序员,在学习ef和lambada表达式的过程中可能遇到的问题. 本次使用订单表和员工表建立多对多关系. 首先是订单表: public class Ord ...
随机推荐
- JS/JQ动态创建(添加)optgroup和option属性
JavaScript和Jquery动态操作select下拉框 相信在前端设计中必然不会少的了表单,因为经常会使用到下拉框选项,又或是把数据动态回显到下拉框中.因为之前牵扯到optgroup标签时遇到了 ...
- Codeforces Round #703 (Div. 2)__ B. Eastern Exhibition__ 纯纯的思维
原题链接https://codeforces.com/contest/1486/problem/B 题目 解题思路 这是个思维题, 算是货仓选址的变式, 想要到达各个点距离最小,我们的目标可以化为先 ...
- 1903021116—吉琛—Java第六周作业—类的定义
项目 内容 课程班级博客链接 19信计班 这个作业要求链接 第六周作业链接 java面向对象的概念和定义 博客名称 学号-姓名-Java第六周作业-题目自拟 要求 每道题要有题目,代码(使用插入代码, ...
- HTML中的Hack手段之条件注释
通常WEB的好处就是可以跨平台,但这个世界偏偏有个另类,就是IE浏览器.在平常做HTML设计时,有时需要为IE的表示差异而不得不使用一些Hack手段.条件注释就是这类手段之一. 条件注释是IE浏览器的 ...
- PHP的Laravel与Composer部署项目时常见问题
我们在部署PHP项目时,其实大部分的PHP项目会创建环境检测与一键**Install**页面. 但是,有许多的项目还采用了Composer部署. 什么是Composer 至于什么是Composer,我 ...
- 08. 树莓派安装MySQL
1. 配置国内源(如果之前设置过可跳过步骤1~步骤2) vim /etc/apt/sources.list.d/raspi.list 2. 添加源 ,文档内原先的内容在开头加#号注释掉,加上下面这个 ...
- jdk1.8中hashmap的扩容resize
当hashmap第一次插入元素.元素个数达到容量阀值threshold时,都会扩容resize(),源码: (假设hashmap扩容前的node数组为旧横向node数组,扩容后的node数组为新横向n ...
- 在MAUI中使用Masa Blazor
Masa Blazor是什么 在此之前我们已经介绍过什么是Masa Blazor,以及如何使用Masa Balzor,如果还有不了解Masa Blazor的同学可以看我上篇文章[初识Masa Blaz ...
- php错误异常及其排错
错误和异常 错误 php程序自身的问题,一般是由非法的语法,环境问题导致 异常 一般是业务逻辑上出现的不合预期.与正常流程不同的状况,不是语法错误 错误异常继承关系 小括号表示php版本 php7下的 ...
- insert语句生成的存储过程
问题: 1.如何配置数据库数据: 方式一:图形界面点击输入数据,导出成sql. 缺点:表多,数据多的时候非常繁琐,字段含义需要另外开窗口对照. 方式二:徒手写或者修改已有语句:insert table ...