Django中ORM多对多表的操作
自己创建第三张表建立多对多关系
表的创建
# 老师表和学生表可以是一个多对多的关系,建表时可以手动建立第三张表建立关联 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多对多表的操作的更多相关文章
- Django中ORM系统多表数据操作
一,多表操作之增删改查 1.在seting.py文件中配置数据库连接信息 2.创建数据库关联关系models.py from django.db import models # Create your ...
- Django之ORM多对多表创建方式,AJAX异步提交,分页器组件等
MTV与MVC MTV模型: M:模型层(models.py),负责业务对象和数据库关系的映射(ORM) T:模板层(Template),负责如何把页面展示给用户(HTML) V:视图层( ...
- Django中ORM创建表关系
一:django中ORM创建表关系 ORM创建外键关系 1.表与表之间的关系 1.表与表之间的关系 一对多 一对一 多对多 2.操作目标条件: 图书表 出版社表 作者表 作者详情表 3.外键关联 一对 ...
- 6月20日 Django中ORM介绍和字段、字段参数、相关操作
一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...
- Django中ORM介绍和字段及其参数
ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- Django中ORM对数据库的增删改查
Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...
- 【Django】ajax(多对多表单)
1.前后端交互 <div class="shade hide"></div> <!--遮罩层,全屏--> <div class=" ...
- Django中ORM的使用
Django中ORM的使用 ORM orm(object-relation-mapping)对象关系映射,即用对象来表示关系数据库中的表: 类 --> 表, 对象-->一行数据 对象的属性 ...
随机推荐
- fkutter Stepper步骤指示器
一个Material Design 步骤指示器,显示一系列步骤的过程 import 'package:flutter/material.dart'; class StepperDemo extends ...
- 一些有用的github收藏(持续更新中...)
1.facebook的c++开源库folly(Facebook open source library)介绍 https://github.com/facebook/folly 2.pprint 一个 ...
- NativeExcel3使用示例
除了XLSReadWriteII5,还有个NativeExcel也是比较好的操作excel的组件,现将NativeExcel3的使用示例写一下,以下是代码和生成的excel表格的效果: procedu ...
- 报错:Unable to read additional data from client sessionid 0x36ab52d38c20b20, likely client has closed socket
报错背景: CDH集群中,将kafka和Flume整合,将kafka的数据发送给Flume消费. 启动kafka的时候正常,但是启动Flume的时候出现了报错现象. 但是我检查了Flume,Flume ...
- mybatis typeHandler类型转换器
typeHandler类型转换器 在JDBC中,需要在PreparedStatement对象中设置那些已经预编译过的SQL语句的参数.执行SQL后,会通过ResultSet对象获取得到数据库的数据,而 ...
- HR数据分析常用的50个公式
HR数据分析常用的50个公式 HR经常需要和数据打交道,如入职率.离职率.加班费计算等.虽然日常工作中,单个数据的计算并不麻烦,但几十上百个累计在一起,确实很容易混淆,甚至计算失误.今天小编急HR之所 ...
- antd 用 customize-cra 方式引入 sass
antd 用 customize-cra 方式引入 sass 只需要安装:node-sass 即可
- HTML布局水平导航条1制作
该文是用css制作个导航条,用竖线分隔,导航条是点击的多个区块.步骤:ul里设置需要数量的li,li中加上a链接给ul加样式,去掉默认的前面的点给li设置左浮动,让ul里的li横向排列a链接设置成块状 ...
- Raspberry Pi 3B I2C 问题
刚刚接触树莓派,的确很适合用来学习,资料多而且很规范,开发者多,平台统一,很多问题别人都已经解决.
- 微信小程序之 语言特点
主页面的CSS样式默认为index.wxss,无需引入