前言

一个学生可以对应多个老师,一个老师也可以教多个学生,这就是一种多对多的关系

models建表

新建一个老师表Teacher,和一个学生表Student

  1. class Teacher(models.Model):
  2. '''老师表'''
  3. teacher_name = models.CharField(max_length=30, verbose_name="老师", default="")
  4. tel = models.CharField(max_length=30, verbose_name="电话", default="")
  5. mail = models.CharField(max_length=30, verbose_name="邮箱", default="")
  6. class Meta:
  7. verbose_name = "老师"
  8. verbose_name_plural = verbose_name
  9. def __str__(self):
  10. return self.teacher_name
  11. class Student(models.Model):
  12. '''学生表'''
  13. student_id = models.CharField(max_length=30, verbose_name="学号", default="")
  14. name = models.CharField(max_length=30, verbose_name="姓名", default="")
  15. age = models.IntegerField(verbose_name="年龄", default="")
  16. # 多对多
  17. teachers = models.ManyToManyField(Teacher, verbose_name="老师")
  18. class Meta:
  19. verbose_name = "学生"
  20. verbose_name_plural = verbose_name
  21. def __str__(self):
  22. return self.name

之后执行 makemigrations 和migrate,同步数据

python manage.py makemigrations

python manage.py migrate

同步之后数据库里面会新增三张表:student、teacher、student_teachers

shell模式新增数据

为了调试方便,可以使用django的shell模式,对表的数据增删改查操作,打开cmd,cd到manage.py目录

python manage.py shell

多对多表的增加数据

  1. >>> from hello.models import Teacher, Student
  2. >>> t1=Teacher.objects.create(teacher_name='刘老师',tel='155300001111',mail='1000@qq.com')
  3. >>> t1.save()
  4. >>> t1
  5. <Teacher: Teacher object (1)>
  6. >>> t2=Teacher.objects.create(teacher_name='万老师',tel='155300001112',mail='1001@qq.com')
  7. >>> t2.save()
  8. >>> t2
  9. <Teacher: Teacher object (2)>
  10. >>> s1=Student.objects.create(student_id='11002200',name='张三',age=19)
  11. >>> s1.save()
  12. # 方法一:添加id
  13. # 可以添加Teacher对应的id
  14. >>> s1.teachers.add(1)
  15. # 也可以添加多个id,逗号隔开
  16. >>> s1.teachers.add(1,2)
  17. # 如果添加的是传一个可迭代对象(list或tupule),可以用*分开传入这种方法
  18. >>> s1.teachers.add(*[1,2])
  19. # 方法二、直接添加对象
  20. >>> s1.teachers.add(t1)
  21. >>> s1.teachers.add(t2)
  22. >>> s1.teachers.add(t1,t2)
  23. # 也可以先查询需要添加的对象
  24. >>> ob=Teacher.objects.get(teacher_name='刘老师')
  25. >>> ob
  26. <Teacher: Teacher object (1)>
  27. >>> s2=Student.objects.create(student_id='11002201',name='李四',age=19)
  28. >>> s2.teachers.add(ob)

正向查询

通过student表对象,查询到对应的teacher

  1. >>> from hello.models import Teacher, Student
  2. >>> stu=Student.objects.filter(name='李四').first()
  3. >>> stu
  4. <Student: Student object (2)>
  5. >>> stu.student_id
  6. '11002201'
  7. # 正向查询
  8. >>> stu.teachers.all()
  9. <QuerySet [<Teacher: Teacher object (1)>]>
  10. >>> stu.teachers.all()[0].teacher_name
  11. '刘老师'
  12. >>> stu.teachers.all()[0].tel
  13. '155300001111'

反向查询_set

通过老师名称,查询对应关联的学生,反向查询的时候在关联表名称后面加_set,如果设置related_name参数,就用related_name参数对应名称查询

参考上一篇https://www.cnblogs.com/yoyoketang/p/10573218.html

  1. >>> tea=Teacher.objects.filter(teacher_name='刘老师').first()
  2. >>> tea
  3. <Teacher: Teacher object (1)>
  4. >>> tea.tel
  5. '155300001111'
  6. # 反向查询
  7. >>> tea.student_set.all()
  8. <QuerySet [<Student: Student object (1)>, <Student: Student object (2)>]>
  9. >>> tea.student_set.all()[0].name
  10. '张三'
  11. >>>

xadmin注册表

  1. # adminx.py
  2. import xadmin
  3. from .models import Card, CardDetail, Teacher, Student
  4. class ControlTeacher(object):
  5. # 显示的字段
  6. list_display = ["teacher_name", "tel", "mail"]
  7. class ControlStudent(object):
  8. # 显示的字段
  9. list_display = ('student_id', 'name', 'age', '老师')
  10. # # 定义一个方法,遍历book的auth,然后用列表返回
  11. def 老师(self, obj):
  12. return [x.teacher_name for x in obj.teachers.all()]
  13. xadmin.site.register(Teacher, ControlTeacher)
  14. xadmin.site.register(Student, ControlStudent)

xadmin后台显示效果

python测试开发django-38.多对多(ManyToManyField)查询的更多相关文章

  1. python测试开发django-36.一对一(OneToOneField)关系查询

    前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...

  2. python测试开发django-16.JsonResponse返回中文编码问题

    前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...

  3. python测试开发django-15.查询结果转json(serializers)

    前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...

  4. 2019第一期《python测试开发》课程,10月13号开学

    2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...

  5. python测试开发django-rest-framework-63.基于函数的视图(@api_view())

    前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...

  6. 《Python测试开发技术栈—巴哥职场进化记》—前言

    写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...

  7. python测试开发django-197.django-celery-beat 定时任务

    前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...

  8. python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)

    前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...

  9. 【python测试开发栈】python基础语法大盘点

    周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...

  10. python web开发——django学习(一)第一个连接mysql数据库django网站运行成功

    1.新建一个项目 2.新建一些文件夹方便管理 3.新建一个项目叫message  4.连接数据库 python web开发Django连接mysql 5.在数据库里自动生成django的表  6.运行 ...

随机推荐

  1. JDK7的新玩具java.util.Objects

    空指针异常这个坑爹的异常是初学开发者最常见的坑,那么今天为大家分享一个jdk的新工具java.util.Objects包.里面有很多工具可以帮我们避免空指针异常让我我们的代码写起来更加优雅.下面我们来 ...

  2. SVN使用过程中遇到的一些问题

    更新svn的客户端TortoiseSVN后 ,之前使用svn管理的文件的关联图标消失了 说明:下面的解决方法及图片来自博客:装了SVN,你的关联图标变了没有? 解决办法:在同步的文件点击右键如下图   ...

  3. MyBatis使用示例

    下面是一个简单的MyBatis使用DEMO. 整体结构 整体代码大致如下: POM依赖 需要引用两个jar包,一个是mybatis,另一个是mysql-connector-java,如果是maven工 ...

  4. has the wrong structure

    mysql 5.6升级到5.7之后报错 root@localhost:mysql.sock [test]>show variables like '%log%' ; ERROR 1682 (HY ...

  5. 关于spark standalone模式下的executor问题

    1.spark standalone模式下,worker与executor是一一对应的. 2.如果想要多个worker,那么需要修改spark-env的SPARK_WORKER_INSTANCES为2 ...

  6. io编程,bio,nio,aio

    本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为 ...

  7. kafka配置监控和消费者测试

    概念 运维 配置 监控 生产者与消费者 流处理 分区partition 一定条件下,分区数越多,吞吐量越高.分区也是保证消息被顺序消费的基础,kafka只能保证一个分区内消息的有序性 副本 每个分区有 ...

  8. Eclipse常见设置与操作

    Eclipse虽然被IDEA超越了,但仍然是最佳的JAVA开发工具哈.因为经常会在不同的开发环境中进行开发,所以对Eclipse常见操作做一个记录,以便于查阅,这部分内容会持续进行更新. 界面布局设置 ...

  9. i春秋CTF web题(1)

    之前边看writeup,边做实验吧的web题,多多少少有些收获.但是知识点都已记不清.所以这次借助i春秋这个平台边做题,就当记笔记一样写写writeup(其实都大部分还是借鉴其他人的writeup). ...

  10. 基于SOA的银行系统架构

    Part-1  [简述] 1.通过引入面向服务架构(SOA),企业服务总线(ESB),适配器(Adapter)及面向构件等技术,尝试打造一个统一业务流程服务平台,实现面向流程的服务集成. 2.传统银行 ...