前言

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

models建表

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

class Teacher(models.Model):
'''老师表'''
teacher_name = models.CharField(max_length=30, verbose_name="老师", default="")
tel = models.CharField(max_length=30, verbose_name="电话", default="")
mail = models.CharField(max_length=30, verbose_name="邮箱", default="") class Meta:
verbose_name = "老师"
verbose_name_plural = verbose_name
def __str__(self):
return self.teacher_name class Student(models.Model):
'''学生表'''
student_id = models.CharField(max_length=30, verbose_name="学号", default="")
name = models.CharField(max_length=30, verbose_name="姓名", default="")
age = models.IntegerField(verbose_name="年龄", default="")
# 多对多
teachers = models.ManyToManyField(Teacher, verbose_name="老师") class Meta:
verbose_name = "学生"
verbose_name_plural = verbose_name def __str__(self):
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

多对多表的增加数据

>>> from hello.models import Teacher, Student
>>> t1=Teacher.objects.create(teacher_name='刘老师',tel='155300001111',mail='1000@qq.com')
>>> t1.save()
>>> t1
<Teacher: Teacher object (1)>
>>> t2=Teacher.objects.create(teacher_name='万老师',tel='155300001112',mail='1001@qq.com')
>>> t2.save()
>>> t2
<Teacher: Teacher object (2)>
>>> s1=Student.objects.create(student_id='11002200',name='张三',age=19)
>>> s1.save() # 方法一:添加id
# 可以添加Teacher对应的id
>>> s1.teachers.add(1)
# 也可以添加多个id,逗号隔开
>>> s1.teachers.add(1,2)
# 如果添加的是传一个可迭代对象(list或tupule),可以用*分开传入这种方法
>>> s1.teachers.add(*[1,2]) # 方法二、直接添加对象
>>> s1.teachers.add(t1)
>>> s1.teachers.add(t2)
>>> s1.teachers.add(t1,t2) # 也可以先查询需要添加的对象
>>> ob=Teacher.objects.get(teacher_name='刘老师')
>>> ob
<Teacher: Teacher object (1)>
>>> s2=Student.objects.create(student_id='11002201',name='李四',age=19)
>>> s2.teachers.add(ob)

正向查询

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

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

反向查询_set

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

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

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

xadmin注册表

# adminx.py
import xadmin
from .models import Card, CardDetail, Teacher, Student class ControlTeacher(object):
# 显示的字段
list_display = ["teacher_name", "tel", "mail"] class ControlStudent(object):
# 显示的字段
list_display = ('student_id', 'name', 'age', '老师') # # 定义一个方法,遍历book的auth,然后用列表返回
def 老师(self, obj):
return [x.teacher_name for x in obj.teachers.all()] xadmin.site.register(Teacher, ControlTeacher)
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. react 的JSX语法需要注意哪些点?

    注释方式 ReactDOM.render( <div> {/*JSX 中的注释方式*/} </div>, document.getElementById('root') ) j ...

  2. nginx log 错误502 upstream sent too big header while reading response header from upstream

    cookies的值超出了范围我是说 看看了一下日志 错误502 upstream sent too big header while reading response header from upst ...

  3. Action的模型绑定

    - 你真的会用Action的模型绑定吗?   在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的 ...

  4. 2018 Arab Collegiate Programming Contest (ACPC 2018) E - Exciting Menus AC自动机

    E - Exciting Menus 建个AC自动机求个fail指针就好啦. #include<bits/stdc++.h> #define LL long long #define fi ...

  5. Codeforces Round #475 (Div. 2) C - Alternating Sum

    等比数列求和一定要分类讨论!!!!!!!!!!!! #include<bits/stdc++.h> #define LL long long #define fi first #defin ...

  6. 查询物理表字段(mysql)

    SELECT t.COLUMN_NAME AS NAME, ( CASE WHEN t.IS_NULLABLE = 'YES' THEN '1' ELSE '0' END ) AS ISNULL, ( ...

  7. 使用Metasploit工作区

    使用Metasploit工作区   Metasploit将所有数据都存储在PostgeSQL服务器中的msf数据库.渗透测试人员经常要使用Metasploit同时执行多个任务.为了避免数据混杂,Met ...

  8. android touch事件分发流程

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 三个方法:分发触摸事件dispatchTouchEvent.在触摸事件的时候onTouc ...

  9. 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem F. Finance 模拟题

    Problem F. Finance 题目连接: http://codeforces.com/gym/100714 Description The Big Boss Company (BBC) pri ...

  10. spring cloud 学习(5) - config server

    分布式环境下的统一配置框架,已经有不少了,比如百度的disconf,阿里的diamand.今天来看下spring cloud对应的解决方案: 如上图,从架构上就可以看出与disconf之类的有很大不同 ...