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

表的创建

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

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. Java中使用Socket连接判断Inputstream结束,java tcp socket服务端,python tcp socket客户端

    最近在试着用java写一个socket的服务器,用python写一个socket的客户端来完成二者之间的通信,但是发现存在一个问题,服务器方面就卡在读取inputsream的地方不动了,导致后面的代码 ...

  2. 算法习题---5.11邮件传输代理的交互(Uva814)

    一:题目 当某人从user1@mta1发送给另一个人user1@mta2时,这两个MTA将会通信. 如果两个收件人属于同一个MTA,发送者的MTA只需与这个MTA通信一次就可以把邮件发送给这两个人. ...

  3. Flink MysqlSink 简单样例

    在大数据领域中,有很多nosql 的数据库,典型的 hbase,可以实现大数据量下的快速查询,但是关系型数据的地位还是没办法替代.比如上个项目中,计算完的结果数据,还是会输出到关系型数据库当中.Fli ...

  4. Python - Django - ORM 多对多表结构的三种方式

    多对多的三种方式: ORM 自动创建第三张表 自己创建第三张表, 利用外键分别关联作者和书,关联查询比较麻烦,因为没办法使用 ORM 提供的便利方法 自己创建第三张表,使用 ORM 的 ManyToM ...

  5. 将WPF转为PDF

    https://blog.csdn.net/xgugu1210/article/details/51878104 https://www.cnblogs.com/zeoy/archive/2013/0 ...

  6. centos配置/etc/mail.rc发邮件

    安装mailx: yum install mailx vi /etc/mail.rc set from=524755798@qq.comset smtp="smtps://smtp.qq.c ...

  7. HDU 2089 不要62 数位DP模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 参考博客:https://www.cnblogs.com/HDUjackyan/p/914215 ...

  8. C#图片水印类

    这个是学习用的呃,主要看一下水印在修改图片中距左边的宽度和高度是杂弄的就哦客了. using System; using System.Collections.Generic; using Syste ...

  9. [CareerCup] 9.8 Represent N Cents 组成N分钱

    9.8 Given an infinite number of quarters (25 cents), dimes (10 cents), nickels (5 cents) and pennies ...

  10. Word中如何加载EndNote

    在百度中搜索了很多解决方案,都不尽相同忙了一上午也没解决,然后搁浅,吃过午饭回来在安装目录下找到如下exe文件三四步点击搞定 所以,有时候问题出现了长时间没解决,可以换下环境出去溜达一圈说不定就茅塞顿 ...