Django下ManytoMany 增删改查

建立学生类老师类多对多关系,用ManytoManyField,迁移同步后自动生成中间表tb_Teacher_Student

# 学生类
class Student(models.Model):name = models.CharField(max_length=32)class Meta:db_table = 'tb_Student'# 老师类
class Teacher(models.Model):name = models.CharField(max_length=32)students = models.ManyToManyField('Student',related_name='teacher')class Meta:db_table = 'tb_Teacher'

增,改

  1. add()

    t1=Teacher(name='jotaro') # 实例化老师jotaro
    s1=Student(name='dio')  # 实例化学生dio
    t1.students.add(s1)
    print(t1.name) # 报错 ValueError**: "<Teacher: Teacher object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used.
    

    用add()构建多对多关系之前数据库得先有目标数据。

    t1=Teacher(name='jotaro') # 实例化老师jotaro
    s1=Student(name='dio')  # 实例化学生dio
    t1.students.add(s1)
    t1.save()
    s1.save()
    print(t1.name) # jotaro
    
  2. create()

    建立关系并创建学生对象
    t2 = Teacher(name='joseph')
    t2.save()
    t2.students.create(name='kirakira')
    stu = t2.students.all()
    print(stu) # <QuerySet [<Student: kirakira>]>
    
  3. set()

    # 批量建立对象多对多的关系,存在则覆盖
    t1=Teacher(name='jotaro')
    s1=Student(name='dio')
    s2=Student(name='kira')
    s3=Student(name='paul')s1.save()
    s2.save()
    s3.save()
    t1.save()
    t1.students.add(s1)
    print(t1.students.all()) # <QuerySet [<Student: dio>]>
    t1.students.set([s2,s3])
    print(t1.students.all()) # dio这个学生被覆盖了 <QuerySet [<Student: kira>, <Student: paul>]> 

  1. 由于ManyToManyField设在Teacher表,字段为students,且relate_name为teacher,所以学生对象查所从老师可以直接用学生对象.teacher.all()查出来,老师对象查学生用老师对象.students.

    t2 = Teacher(name='joseph')
    t3 = Teacher(name='jonathan')
    t3.save()
    t2.save()
    t3.students.create(name="kirakira")
    t2.students.add(t3.students.get(name="kirakira"))
    stu = t2.students.get(name='kirakira')
    print(stu.teacher.all()) # <QuerySet [<Teacher: jonathan>, <Teacher: joseph>]>
    
  2. 约束条件查询

    # 查询than名字结尾老师的学生
    stu = Student.objects.filter(name='kirakira')
    than_stu = Student.objects.filter(teacher__name__endswith='than')
    print(than_stu) #<QuerySet [<Student: kirakira>]>
    

  1. delete(),当删除其中一方的对象,多对多表里对应的关系行也自动删除

    
    teacher = Teacher.objects.get(students__name='kirakira')
    print(teacher.students.all()) # <QuerySet [<Student: kirakira>]>
    stu = Student.objects.get(name='kirakira')
    stu.delete()
    print(teacher.students.all()) # <QuerySet []>
    
  2. remove()

    如果单纯想去除单个学生和老师的多对多关系,而不想删除任何一方的数据,可以用remove()
    t1=Teacher(name='jotaro')
    s1=Student(name='dio')
    s1.save()
    t1.save()
    t1.students.add(s1)
    print(t1.students.all()) # <QuerySet [<Student: dio>]>t1.students.remove(s1)
    print(s1) # dio
    print(t1.students.all()) # <QuerySet []>
    
  3. clear()

    清除某个对象所有的多对多关系t1 = Teacher(name='jotaro')
    s1 = Student(name='dio')
    s2 = Student(name='kira')
    s3 = Student(name='paul')
    s1.save()
    s2.save()
    s3.save()
    t1.save()
    t1.students.set([s1, s2, s3])
    print(t1.students.all()) # <QuerySet [<Student: dio>, <Student: kira>, <Student: paul>]>
    t1.students.clear()
    print(t1.students.all()) # <QuerySet []>

ManytoMany字段增删改查Django相关推荐

  1. mysql 删除一个约束条件_MySQL 字段增删改查 和 约束条件

    一.字段操作 1.添加字段 (add) alter table add 字段名 数据类型; desc ; 2.修改字段数据类型 (modify) alter table modify ; 3.字段重命 ...

  2. python增删改查的框架_python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查...

    Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...

  3. Django 07模型层—单表操作(增删改查)

    单表查询 一.数据库相关设置 ''' # Mysql连接配置 DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': ...

  4. SpringMVC表单数据增删改查简易梳理(含实例代码)

    使用SpringMVC创建表单进行数据的增删改查是javaEE开发的基本功,本人根据自己最近开发的基于jeecms框架的网站平台来梳理数据增删改查的思路. 首先根据所需表单页面设计数据库,定义不同字段 ...

  5. python增删改查的框架_简单的Django框架增删改查操作

    Django之orm对MysqL数据库的增删改查操作简介: 利用Django中orm来查找数据库中的数据,对数据库进行增.删.改.查: 增:新增数据 # 操作数据库user表新增记录 # 方式1: u ...

  6. Django 操作Mysql数据库 对表进行增删改查

    为什么80%的码农都做不了架构师?>>>    首先说明:以下方法都是根据表已有的字段添加数据,若想新增字段,则需在类里面新建静态字段, 可参考Django 操作数据库建表  ,增删 ...

  7. Django学习笔记(10)——Book单表的增删改查页面

    一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...

  8. Web框架之Django_02基本操作(Django项目启动配置、数据库连接、orm、增删改查)

    阅读目录 摘要: Django项目简单现实过程 pycharm连接数据库 Django之orm简单操作增删改查 一.新建Django项目.配置.设置: 新建Django项目:(为了熟悉Django操作 ...

  9. Django框架(三)—— orm增删改查、Django生命周期

    orm增删改查.Django生命周期 一.orm介绍 1.什么是orm ORM即Object Relational Mapping,全称对象关系映射. 2.使用orm的优缺点 优点: 不用写SQL语句 ...

最新文章

  1. 多重集合的排列和组合问题
  2. CASS 7.1 和 AutoCAD 2006的安装使用
  3. 图解SQL基础知识,小白也能看懂的SQL文章!
  4. PHP中header的用法
  5. .Net Core in Docker极简入门(上篇)
  6. bmp怎么编辑底色_非标机械设计这个行业前景怎么样
  7. P1319 压缩技术(python3实现)
  8. 6月第二周中国五大顶级域名增2.4万 美国减6.8万
  9. Comparable和Comparator接口是干什么的?列出它们的区别。
  10. 计算最大子段(分治法)
  11. 【ACL2020】关于正式风格迁移的数据增强方法
  12. DPDK-VPP 学习笔记-01
  13. 第14课:JSP动作 JSP param动作(JSP教程 JSP入门实战教程 黄菊华Java网站开发系列教程)
  14. 游戏蛮牛unity权威指南全实例讲解书籍上线
  15. 正点原子STM32学习笔记——MPU6050介绍
  16. 新版gsp五个附录计算机培训,新版GSP附录5 ——验证管理
  17. 腾讯翻译君在线翻译怎么翻译整个文件_希腊语怎么翻译?教你两个超实用的翻译方法...
  18. 偷偷盘点一下各大公司的实习薪资
  19. 机器学习个人资料整理
  20. UVA-11584:Partitioning by Palindromes(基础DP)

热门文章

  1. java native 原理_一种Java+Native应用的系统架构的制作方法
  2. VMvare 安装kali linux系统及网络配置
  3. 国产操作系统第一股,杨涛的麒麟信安是否名副其实?
  4. 前端_#网页设计大作业 总结随记
  5. unity 前端场景搭建UI框架的设计
  6. 关于vue的url请求图片的问题,请求失败
  7. pytorch_Realtime_Multi-Person_Pose_Estimation项目学习
  8. AI+生物计算:用计算机视觉技术理解细胞生命
  9. PU learning
  10. “N刷”为何成为时尚