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

表的创建

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

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. 【转载】 KL距离(相对熵)

    原文地址: https://www.cnblogs.com/nlpowen/p/3620470.html ----------------------------------------------- ...

  2. windows nginx重启脚本.bat

    在nginx.exe目录下新建txt文件写入 @echo offtaskkill /f /fi "IMAGENAME eq nginx.exe"start nginx.exe#pa ...

  3. training 2

    Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.136 Average Precision (AP) @[ IoU ...

  4. Linux strace追踪命令详解

    strace介绍 strace命令是一个集诊断.调试.统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的.当然s ...

  5. Spring MVC入门的实例

      作为Spring MVC入门,以XML配置的方式为例.首先需要配置Web工程的web.xml文件. 代码清单14-1:web.xml配置Spring MVC <?xml version=&q ...

  6. C#中,子线程与主线程之间的通信是如何实现(转)

    注: 项目中按照这个方法调试成功: 通常我们会有这种需求: 一个支持慢速设备的处理类,如网络通信.串口通信.打印等 此时经常需要将线程封装在类里面,让类支持异步处理,然后发布事件或者回调委托通知主线程 ...

  7. css样式writing-mode垂直书写测试

    writing-mode:控制文字的属性方向,但是不是所有的浏览器都兼容,在网页上使用时,有的浏览器显示不出该样式.该文测试的是垂直书写:网上对于测试的属性值的解释是:tb-rl:上-下,右-左.对象 ...

  8. div定位relative和absolute测试2

    之前的博文:div定位relative和absolute测试1.中,body包含了蓝色和红色div,蓝色的相对定位,相对于body向下偏移了10px位置,红色绝对定位,相对浏览器偏移了10px位置. ...

  9. __proto__和prototype的一些理解

    var Person = function(name) { this.name = name; } var p = new Person(); new操作符的操作是 var p = {} p.__pr ...

  10. 查找searching

    查找searching 在有序数列中查找某一个数据时候的算法设计 查找表的分类 静态查找表:只进行查找操作 动态查找表:不断的插入不存在,删除已存在 查找表的操作 查找.插入.删除 查找也叫检索,是根 ...