自己创建第三张表建立多对多关系

表的创建

# 老师表和学生表可以是一个多对多的关系,建表时可以手动建立第三张表建立关联

class Student(models.Model):
name = models.CharField(max_length=32, null=True)
age = models.CharField(max_length=32, null=True) class Teacher(models.Model):
name = models.CharField(max_length=32, null=True)
gender = models.CharField(max_length=32, null=True) # 建立第三张表,把前两张表关联起来
class TeacherToStudent(models.Model):
stu = models.ForeignKey('Student', null=True)
teac = models.ForeignKey('Teacher', null=True)

增删改查的操作

# 增  直接通过models.类名.objects.create进行添加
models.Student.objects.create(name="xxx",age=12)
models.Teacher.objects.create(name="ooo",gender="男")
models.TeacherToStudent.objects.create(stu_id=1, teac_id=1) # 删 找出对象.delete() ,并且把对应关系也删了
models.Teacher.objects.filter(id=4).delete()
models.TeacherToStudent.objects.filter(teac_id=4).delete() # 改 一样不同的表分开操作
models.Teacher.objects.filter(id=3).update(name="xoxo") # 查 ,如果我想查询一个学生同时被多少个老师教,有图下三种方法
# 1:
res = models.Student.objects.filter(id=2).all() # 先查出符合条件的学生
for row in res:
print(row.name)
r = row.teachertostudent_set.all() # (反查)表示第三张表中所有学生id为2的行
for i in r:
# i.teac # (正查)表示对应的老师表里的一列
print(i.teac.name) # 查出学生id为2对应的所有老师 # 2:
res = models.TeacherToStudent.objects.filter(stu__name="cao").all()
# 查出来的是学生名字为cao对应的所有的行(神奇的双下划线)
for row in res:
print(row.stu.name, row.teac.name) # 找到学生和老师的对应关系 # 3:
res = models.TeacherToStudent.objects.filter(stu__name="li").values("teac__name")
# 查出来的QuerySet 列表,里面包含字典
print(res)

Django中方法创建多对多关系

表的创建

# 表的创建,创建一个班级和课程的多对多关系
# 通过django中的ManyToManyField创建多对多关系,字段放在两个列中任意一个都可以
class Classes(models.Model):
name = models.CharField(max_length=32, null=True)
course = models.ManyToManyField('Course') class Course(models.Model):
name = models.CharField(max_length=32, null=True)

增删改查的操作

# 增 先要找到对应的班级或者课程对象
obj = models.Classes.objects.filter(id=4).first()
# 找到之后通过建表时的course.add进行添加,要把课程id放在列表里打散传进去
obj.course.add(1) # 增加一个
obj.course.add(*[2,3]) # 增加多个 # 删 找到对象.建表时的属性名.clear() 删除所有
obj = models.Classes.objects.filter(id=4).first()
obj.course.clear() # 重置(改),也是找到对象,通过.set()方法,里面放一个列表
obj = models.Classes.objects.filter(id=3).first()
obj.course.set([1,2,3]) # 查 对于模型类中有ManyToManyField字段的表来说
res = models.Classes.objects.all() # 先查出所有的对象
for row in res:
print(row.name)
for i in row.course.all(): # row.course.all()就是每个班级对应的所有课程对象
print(i.name)
#对于模型类中没有ManyToManyField字段的表来说
res = models.Course.objects.all() # 也是先查出所有的对象
for row in res:
print("===================")
print(row.name)
for i in row.classes_set.all(): # 每个学科对应的所有班级
print(i.name)

注:这两种方法建立多对多关系都是可以的,分情况考虑用哪一个,如果表之间的关系简单,

  第三张表中不需要加入除两张表id以外的字段可以用django创建但是如果表关系比较复杂,

  并且,第三张表中还需要加入一些其他的字段,就需要用到我们自定义的多对多关系(

  手动创建第三张表),可以自定制第三张表的结构

Django中ORM多对多表的操作的更多相关文章

  1. Django中ORM系统多表数据操作

    一,多表操作之增删改查 1.在seting.py文件中配置数据库连接信息 2.创建数据库关联关系models.py from django.db import models # Create your ...

  2. Django之ORM多对多表创建方式,AJAX异步提交,分页器组件等

    MTV与MVC MTV模型: ​ M:模型层(models.py),负责业务对象和数据库关系的映射(ORM) ​ T:模板层(Template),负责如何把页面展示给用户(HTML) ​ V:视图层( ...

  3. Django中ORM创建表关系

    一:django中ORM创建表关系 ORM创建外键关系 1.表与表之间的关系 1.表与表之间的关系 一对多 一对一 多对多 2.操作目标条件: 图书表 出版社表 作者表 作者详情表 3.外键关联 一对 ...

  4. 6月20日 Django中ORM介绍和字段、字段参数、相关操作

    一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...

  5. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  6. Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

  7. Django中ORM对数据库的增删改查

    Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...

  8. 【Django】ajax(多对多表单)

    1.前后端交互 <div class="shade hide"></div> <!--遮罩层,全屏--> <div class=" ...

  9. Django中ORM的使用

    Django中ORM的使用 ORM orm(object-relation-mapping)对象关系映射,即用对象来表示关系数据库中的表: 类 --> 表, 对象-->一行数据 对象的属性 ...

随机推荐

  1. 编写第一个dart程序hello dart

    /* 入口方法的两种定义方式 main(){ print('hello dart'); } */ ///这也是一个注释 //表示main方法没有返回值 void main(){ print('hell ...

  2. netty5服务端检测心跳超时断连

    客户端每5秒发送一次心跳给服务端,服务端记录最后一次心跳时间,通过定时任务每10秒检测一下,如果当前时间与最后一次收到的心跳时间之差超过某个阈值,断开与客户端的连接.基于之前的例子(netty5心跳与 ...

  3. 安卓 android studio 报错 Unknown host 'jcenter.bintray.com'. You may need to adjust the proxy settings in Gradle.

    报错截图: 问题原因:因为build.gradle中jcenter()或者maven()被墙了,所以会出现这种情况. 解决方案:(我的gradle版本是:classpath 'com.android. ...

  4. 详细介绍Oracle数据库的聚簇技术

    作者:☜ Tracy ☞ 1. 什么是聚簇 d1=A=: 聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的.聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点.非聚簇索引的顺序与 ...

  5. Linux系统调优——内核相关参数(五)

    修改内核参数有3种办法:一种临时修改,两种永久修改. 临时修改是使用sysctl [选项] [参数名=值]命令:永久修改是修改/etc/sysctl.conf文件或修改/proc/sys/目录下的对应 ...

  6. LeetCode_258. Add Digits

    258. Add Digits Easy Given a non-negative integer num, repeatedly add all its digits until the resul ...

  7. ubuntu18.04连接pptpd服务器(未成功)

    sudo apt-get install pptp-linux sudo pptpsetup --create testvpn --server 127.0.0.1 --username your_u ...

  8. VSIX 插件

    https://blog.csdn.net/lynchee/article/details/83065608

  9. crontab每小时运行一次

    先给出crontab的语法格式 对于网上很多给出的每小时定时任务写法,可以说绝大多数都是错误的!比如对于下面的这种写法: 00 * * * * #每隔一小时执行一次 00 */1 * * * #与上面 ...

  10. STM32之中断函数

    本文做中断函数的索引,帮助我们找到中断函数名.中断函数参数以及中断服务函数他们的来源,以便我们编程. 1)如果一个工程只有一个中断,则我们可以进行两个步骤就可以了: 使能中断通道 编写中断服务函数 2 ...